item_strfunc.h 21.4 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000-2003 MySQL AB
2

unknown's avatar
unknown committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
7

unknown's avatar
unknown committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
12

unknown's avatar
unknown committed
13 14 15 16 17 18 19
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


/* This file defines all string functions */

20
#ifdef USE_PRAGMA_INTERFACE
unknown's avatar
unknown committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34
#pragma interface			/* gcc class implementation */
#endif

class Item_str_func :public Item_func
{
public:
  Item_str_func() :Item_func() { decimals=NOT_FIXED_DEC; }
  Item_str_func(Item *a) :Item_func(a) {decimals=NOT_FIXED_DEC; }
  Item_str_func(Item *a,Item *b) :Item_func(a,b) { decimals=NOT_FIXED_DEC; }
  Item_str_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) { decimals=NOT_FIXED_DEC; }
  Item_str_func(Item *a,Item *b,Item *c,Item *d) :Item_func(a,b,c,d) {decimals=NOT_FIXED_DEC; }
  Item_str_func(Item *a,Item *b,Item *c,Item *d, Item* e) :Item_func(a,b,c,d,e) {decimals=NOT_FIXED_DEC; }
  Item_str_func(List<Item> &list) :Item_func(list) {decimals=NOT_FIXED_DEC; }
  longlong val_int();
35
  double val_real();
unknown's avatar
unknown committed
36 37
  enum Item_result result_type () const { return STRING_RESULT; }
  void left_right_max_length();
38
  String *check_well_formed_result(String *str);
unknown's avatar
unknown committed
39 40 41 42 43 44 45 46 47 48 49 50
};

class Item_func_md5 :public Item_str_func
{
  String tmp_value;
public:
  Item_func_md5(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "md5"; }
};

51

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
class Item_func_sha :public Item_str_func
{
public:
  Item_func_sha(Item *a) :Item_str_func(a) {}  
  String *val_str(String *);    
  void fix_length_and_dec();      
  const char *func_name() const { return "sha"; }	
};

class Item_func_aes_encrypt :public Item_str_func
{
public:
  Item_func_aes_encrypt(Item *a, Item *b) :Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "aes_encrypt"; }
};

class Item_func_aes_decrypt :public Item_str_func	
{
public:
  Item_func_aes_decrypt(Item *a, Item *b) :Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "aes_decrypt"; }
};


unknown's avatar
unknown committed
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
class Item_func_concat :public Item_str_func
{
  String tmp_value;
public:
  Item_func_concat(List<Item> &list) :Item_str_func(list) {}
  Item_func_concat(Item *a,Item *b) :Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "concat"; }
};

class Item_func_concat_ws :public Item_str_func
{
  String tmp_value;
public:
95
  Item_func_concat_ws(List<Item> &list) :Item_str_func(list) {}
unknown's avatar
unknown committed
96 97
  String *val_str(String *);
  void fix_length_and_dec();
98
  const char *func_name() const { return "concat_ws"; }
unknown's avatar
unknown committed
99
  table_map not_null_tables() const { return 0; }
unknown's avatar
unknown committed
100 101 102 103 104 105 106 107
};

class Item_func_reverse :public Item_str_func
{
public:
  Item_func_reverse(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  void fix_length_and_dec();
108
  const char *func_name() const { return "reverse"; }
unknown's avatar
unknown committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
};


class Item_func_replace :public Item_str_func
{
  String tmp_value,tmp_value2;
public:
  Item_func_replace(Item *org,Item *find,Item *replace)
    :Item_str_func(org,find,replace) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "replace"; }
};


class Item_func_insert :public Item_str_func
{
  String tmp_value;
public:
  Item_func_insert(Item *org,Item *start,Item *length,Item *new_str)
    :Item_str_func(org,start,length,new_str) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "insert"; }
};


class Item_str_conv :public Item_str_func
{
138 139 140 141 142
protected:
  uint multiply;
  uint (*converter)(CHARSET_INFO *cs, char *src, uint srclen,
                                      char *dst, uint dstlen);
  String tmp_value;
unknown's avatar
unknown committed
143 144
public:
  Item_str_conv(Item *item) :Item_str_func(item) {}
145
  String *val_str(String *);
unknown's avatar
unknown committed
146 147 148 149 150 151 152 153
};


class Item_func_lcase :public Item_str_conv
{
public:
  Item_func_lcase(Item *item) :Item_str_conv(item) {}
  const char *func_name() const { return "lcase"; }
154 155 156 157 158 159 160
  void fix_length_and_dec()
  {
    collation.set(args[0]->collation);
    multiply= collation.collation->casedn_multiply;
    converter= collation.collation->cset->casedn;
    max_length= args[0]->max_length * multiply;
  }
unknown's avatar
unknown committed
161 162 163 164 165 166 167
};

class Item_func_ucase :public Item_str_conv
{
public:
  Item_func_ucase(Item *item) :Item_str_conv(item) {}
  const char *func_name() const { return "ucase"; }
168 169 170 171 172 173 174
  void fix_length_and_dec()
  {
    collation.set(args[0]->collation);
    multiply= collation.collation->caseup_multiply;
    converter= collation.collation->cset->caseup;
    max_length= args[0]->max_length * multiply;
  }
unknown's avatar
unknown committed
175 176 177 178 179
};


class Item_func_left :public Item_str_func
{
180
  String tmp_value;
unknown's avatar
unknown committed
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
public:
  Item_func_left(Item *a,Item *b) :Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "left"; }
};


class Item_func_right :public Item_str_func
{
  String tmp_value;
public:
  Item_func_right(Item *a,Item *b) :Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "right"; }
};


class Item_func_substr :public Item_str_func
{
  String tmp_value;
public:
  Item_func_substr(Item *a,Item *b) :Item_str_func(a,b) {}
  Item_func_substr(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "substr"; }
};


class Item_func_substr_index :public Item_str_func
{
  String tmp_value;
public:
  Item_func_substr_index(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  String *val_str(String *);
218
  void fix_length_and_dec();
219
  const char *func_name() const { return "substring_index"; }
unknown's avatar
unknown committed
220 221 222
};


223
class Item_func_trim :public Item_str_func
unknown's avatar
unknown committed
224
{
225
protected:
unknown's avatar
unknown committed
226
  String tmp_value;
227
  String remove;
unknown's avatar
unknown committed
228
public:
229 230
  Item_func_trim(Item *a,Item *b) :Item_str_func(a,b) {}
  Item_func_trim(Item *a) :Item_str_func(a) {}
unknown's avatar
unknown committed
231
  String *val_str(String *);
232 233
  void fix_length_and_dec();
  const char *func_name() const { return "trim"; }
unknown's avatar
unknown committed
234 235 236
};


237
class Item_func_ltrim :public Item_func_trim
unknown's avatar
unknown committed
238 239
{
public:
240 241
  Item_func_ltrim(Item *a,Item *b) :Item_func_trim(a,b) {}
  Item_func_ltrim(Item *a) :Item_func_trim(a) {}
unknown's avatar
unknown committed
242
  String *val_str(String *);
243
  const char *func_name() const { return "ltrim"; }
unknown's avatar
unknown committed
244 245
};

246 247

class Item_func_rtrim :public Item_func_trim
unknown's avatar
unknown committed
248 249
{
public:
250 251
  Item_func_rtrim(Item *a,Item *b) :Item_func_trim(a,b) {}
  Item_func_rtrim(Item *a) :Item_func_trim(a) {}
unknown's avatar
unknown committed
252
  String *val_str(String *);
253
  const char *func_name() const { return "rtrim"; }
unknown's avatar
unknown committed
254 255 256
};


257 258 259 260 261
/*
  Item_func_password -- new (4.1.1) PASSWORD() function implementation.
  Returns strcat('*', octet2hex(sha1(sha1(password)))). '*' stands for new
  password format, sha1(sha1(password) is so-called hash_stage2 value.
  Length of returned string is always 41 byte. To find out how entire
262
  authentication procedure works, see comments in password.c.
263 264
*/

unknown's avatar
unknown committed
265 266
class Item_func_password :public Item_str_func
{
267
  char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH+1]; 
unknown's avatar
unknown committed
268 269
public:
  Item_func_password(Item *a) :Item_str_func(a) {}
270 271
  String *val_str(String *str);
  void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH; }
unknown's avatar
unknown committed
272
  const char *func_name() const { return "password"; }
unknown's avatar
unknown committed
273
  static char *alloc(THD *thd, const char *password);
unknown's avatar
unknown committed
274 275
};

276

277 278 279
/*
  Item_func_old_password -- PASSWORD() implementation used in MySQL 3.21 - 4.0
  compatibility mode. This item is created in sql_yacc.yy when
280
  'old_passwords' session variable is set, and to handle OLD_PASSWORD()
281 282 283
  function.
*/

284 285
class Item_func_old_password :public Item_str_func
{
286
  char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1];
287 288
public:
  Item_func_old_password(Item *a) :Item_str_func(a) {}
289 290
  String *val_str(String *str);
  void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; } 
291
  const char *func_name() const { return "old_password"; }
unknown's avatar
unknown committed
292
  static char *alloc(THD *thd, const char *password);
293 294 295
};


296 297 298 299 300 301 302
class Item_func_des_encrypt :public Item_str_func
{
  String tmp_value;
public:
  Item_func_des_encrypt(Item *a) :Item_str_func(a) {}
  Item_func_des_encrypt(Item *a, Item *b): Item_str_func(a,b) {}
  String *val_str(String *);
unknown's avatar
unknown committed
303 304
  void fix_length_and_dec()
  { maybe_null=1; max_length = args[0]->max_length+8; }
305
  const char *func_name() const { return "des_encrypt"; }
306 307 308 309 310 311 312 313 314
};

class Item_func_des_decrypt :public Item_str_func
{
  String tmp_value;
public:
  Item_func_des_decrypt(Item *a) :Item_str_func(a) {}
  Item_func_des_decrypt(Item *a, Item *b): Item_str_func(a,b) {}
  String *val_str(String *);
315
  void fix_length_and_dec() { maybe_null=1; max_length = args[0]->max_length; }
316
  const char *func_name() const { return "des_decrypt"; }
317 318
};

unknown's avatar
unknown committed
319 320 321 322 323 324 325 326
class Item_func_encrypt :public Item_str_func
{
  String tmp_value;
public:
  Item_func_encrypt(Item *a) :Item_str_func(a) {}
  Item_func_encrypt(Item *a, Item *b): Item_str_func(a,b) {}
  String *val_str(String *);
  void fix_length_and_dec() { maybe_null=1; max_length = 13; }
unknown's avatar
unknown committed
327
  const char *func_name() const { return "encrypt"; }
unknown's avatar
unknown committed
328 329 330 331
};

#include "sql_crypt.h"

332

unknown's avatar
unknown committed
333 334 335 336 337 338 339 340 341
class Item_func_encode :public Item_str_func
{
 protected:
  SQL_CRYPT sql_crypt;
public:
  Item_func_encode(Item *a, char *seed):
    Item_str_func(a),sql_crypt(seed) {}
  String *val_str(String *);
  void fix_length_and_dec();
342
  const char *func_name() const { return "encode"; }
unknown's avatar
unknown committed
343 344
};

345

unknown's avatar
unknown committed
346 347 348 349 350
class Item_func_decode :public Item_func_encode
{
public:
  Item_func_decode(Item *a, char *seed): Item_func_encode(a,seed) {}
  String *val_str(String *);
351
  const char *func_name() const { return "decode"; }
unknown's avatar
unknown committed
352 353 354
};


355
class Item_func_sysconst :public Item_str_func
unknown's avatar
unknown committed
356 357
{
public:
358 359 360
  Item_func_sysconst()
  { collation.set(system_charset_info,DERIVATION_SYSCONST); }
  Item *safe_charset_converter(CHARSET_INFO *tocs);
361 362 363 364 365 366
  /*
    Used to create correct Item name in new converted item in
    safe_charset_converter, return string representation of this function
    call
  */
  virtual const char *fully_qualified_func_name() const = 0;
367 368
};

369

370 371 372 373
class Item_func_database :public Item_func_sysconst
{
public:
  Item_func_database() :Item_func_sysconst() {}
unknown's avatar
unknown committed
374
  String *val_str(String *);
unknown's avatar
unknown committed
375 376
  void fix_length_and_dec()
  {
377
    max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
unknown's avatar
unknown committed
378
    maybe_null=1;
379
  }
unknown's avatar
unknown committed
380
  const char *func_name() const { return "database"; }
381
  const char *fully_qualified_func_name() const { return "database()"; }
unknown's avatar
unknown committed
382 383
};

384

385
class Item_func_user :public Item_func_sysconst
unknown's avatar
unknown committed
386
{
387 388
  bool is_current;

unknown's avatar
unknown committed
389
public:
390 391
  Item_func_user(bool is_current_arg)
    :Item_func_sysconst(), is_current(is_current_arg) {}
unknown's avatar
unknown committed
392
  String *val_str(String *);
393 394 395 396
  void fix_length_and_dec()
  {
    max_length= ((USERNAME_LENGTH + HOSTNAME_LENGTH + 1) *
                 system_charset_info->mbmaxlen);
397
  }
398 399 400 401
  const char *func_name() const
    { return is_current ? "current_user" : "user"; }
  const char *fully_qualified_func_name() const
    { return is_current ? "current_user()" : "user()"; }
unknown's avatar
unknown committed
402 403 404 405 406
};


class Item_func_soundex :public Item_str_func
{
unknown's avatar
unknown committed
407
  String tmp_value;
unknown's avatar
unknown committed
408 409 410 411 412 413 414 415 416 417 418
public:
  Item_func_soundex(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "soundex"; }
};


class Item_func_elt :public Item_str_func
{
public:
419
  Item_func_elt(List<Item> &list) :Item_str_func(list) {}
420
  double val_real();
unknown's avatar
unknown committed
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
  longlong val_int();
  String *val_str(String *str);
  void fix_length_and_dec();
  const char *func_name() const { return "elt"; }
};


class Item_func_make_set :public Item_str_func
{
  Item *item;
  String tmp_str;

public:
  Item_func_make_set(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
  String *val_str(String *str);
436
  bool fix_fields(THD *thd, Item **ref)
unknown's avatar
unknown committed
437
  {
438
    DBUG_ASSERT(fixed == 0);
439
    return ((!item->fixed && item->fix_fields(thd, &item)) ||
unknown's avatar
unknown committed
440
	    item->check_cols(1) ||
441
	    Item_func::fix_fields(thd, ref));
unknown's avatar
unknown committed
442
  }
443
  void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
unknown's avatar
unknown committed
444 445 446
  void fix_length_and_dec();
  void update_used_tables();
  const char *func_name() const { return "make_set"; }
unknown's avatar
unknown committed
447 448 449 450 451 452

  bool walk(Item_processor processor, byte *arg)
  {
    return item->walk(processor, arg) ||
      Item_str_func::walk(processor, arg);
  }
unknown's avatar
unknown committed
453
  Item *transform(Item_transformer transformer, byte *arg)
454
  {
unknown's avatar
unknown committed
455
    Item *new_item= item->transform(transformer, arg);
456 457 458
    if (!new_item)
      return 0;
    item= new_item;
unknown's avatar
unknown committed
459
    return Item_str_func::transform(transformer, arg);
460
  }
461
  void print(String *str);
unknown's avatar
unknown committed
462 463 464 465 466 467 468 469 470 471 472
};


class Item_func_format :public Item_str_func
{
  String tmp_str;
public:
  Item_func_format(Item *org,int dec);
  String *val_str(String *);
  void fix_length_and_dec()
  {
473
    collation.set(default_charset());
unknown's avatar
unknown committed
474 475 476
    max_length=args[0]->max_length+(args[0]->max_length-args[0]->decimals)/3;
  }
  const char *func_name() const { return "format"; }
477
  void print(String *);
unknown's avatar
unknown committed
478 479 480 481 482 483
};


class Item_func_char :public Item_str_func
{
public:
unknown's avatar
unknown committed
484 485 486 487
  Item_func_char(List<Item> &list) :Item_str_func(list)
  { collation.set(&my_charset_bin); }
  Item_func_char(List<Item> &list, CHARSET_INFO *cs) :Item_str_func(list)
  { collation.set(cs); }  
unknown's avatar
unknown committed
488
  String *val_str(String *);
489 490
  void fix_length_and_dec() 
  { 
unknown's avatar
unknown committed
491 492
    maybe_null=0;
    max_length=arg_count * collation.collation->mbmaxlen;
493
  }
unknown's avatar
unknown committed
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
  const char *func_name() const { return "char"; }
};


class Item_func_repeat :public Item_str_func
{
  String tmp_value;
public:
  Item_func_repeat(Item *arg1,Item *arg2) :Item_str_func(arg1,arg2) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "repeat"; }
};


class Item_func_rpad :public Item_str_func
{
511
  String tmp_value, rpad_str;
unknown's avatar
unknown committed
512 513 514 515 516 517 518 519 520 521 522
public:
  Item_func_rpad(Item *arg1,Item *arg2,Item *arg3)
    :Item_str_func(arg1,arg2,arg3) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "rpad"; }
};


class Item_func_lpad :public Item_str_func
{
523
  String tmp_value, lpad_str;
unknown's avatar
unknown committed
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538
public:
  Item_func_lpad(Item *arg1,Item *arg2,Item *arg3)
    :Item_str_func(arg1,arg2,arg3) {}
  String *val_str(String *);
  void fix_length_and_dec();
  const char *func_name() const { return "lpad"; }
};


class Item_func_conv :public Item_str_func
{
public:
  Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  const char *func_name() const { return "conv"; }
  String *val_str(String *);
unknown's avatar
unknown committed
539 540
  void fix_length_and_dec()
  {
541
    collation.set(default_charset());
unknown's avatar
unknown committed
542
    decimals=0; max_length=64;
543
  }
unknown's avatar
unknown committed
544 545
};

unknown's avatar
unknown committed
546 547 548 549 550 551 552 553

class Item_func_hex :public Item_str_func
{
  String tmp_value;
public:
  Item_func_hex(Item *a) :Item_str_func(a) {}
  const char *func_name() const { return "hex"; }
  String *val_str(String *);
unknown's avatar
unknown committed
554 555
  void fix_length_and_dec()
  {
556
    collation.set(default_charset());
unknown's avatar
unknown committed
557 558
    decimals=0;
    max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
559
  }
unknown's avatar
unknown committed
560 561
};

unknown's avatar
unknown committed
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
class Item_func_unhex :public Item_str_func
{
  String tmp_value;
public:
  Item_func_unhex(Item *a) :Item_str_func(a) {}
  const char *func_name() const { return "unhex"; }
  String *val_str(String *);
  void fix_length_and_dec()
  {
    collation.set(&my_charset_bin);
    decimals=0;
    max_length=(1+args[0]->max_length)/2;
  }
};

unknown's avatar
unknown committed
577

unknown's avatar
unknown committed
578 579 580 581
class Item_func_binary :public Item_str_func
{
public:
  Item_func_binary(Item *a) :Item_str_func(a) {}
582
  String *val_str(String *a)
unknown's avatar
unknown committed
583
  {
584
    DBUG_ASSERT(fixed == 1);
unknown's avatar
unknown committed
585 586
    String *tmp=args[0]->val_str(a);
    null_value=args[0]->null_value;
587 588
    if (tmp)
      tmp->set_charset(&my_charset_bin);
unknown's avatar
unknown committed
589
    return tmp;
unknown's avatar
unknown committed
590
  }
unknown's avatar
unknown committed
591 592 593 594
  void fix_length_and_dec()
  {
    collation.set(&my_charset_bin);
    max_length=args[0]->max_length;
595
  }
596
  void print(String *str);
597
  const char *func_name() const { return "cast_as_binary"; }
unknown's avatar
unknown committed
598 599 600 601 602 603 604 605 606 607 608
};


class Item_load_file :public Item_str_func
{
  String tmp_value;
public:
  Item_load_file(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  const char *func_name() const { return "load_file"; }
  void fix_length_and_dec()
unknown's avatar
unknown committed
609
  {
610
    collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
unknown's avatar
unknown committed
611
    maybe_null=1;
612 613
    max_length=MAX_BLOB_WIDTH;
  }
unknown's avatar
unknown committed
614 615 616 617 618 619 620 621 622 623 624 625 626 627
};


class Item_func_export_set: public Item_str_func
{
 public:
  Item_func_export_set(Item *a,Item *b,Item* c) :Item_str_func(a,b,c) {}
  Item_func_export_set(Item *a,Item *b,Item* c,Item* d) :Item_str_func(a,b,c,d) {}
  Item_func_export_set(Item *a,Item *b,Item* c,Item* d,Item* e) :Item_str_func(a,b,c,d,e) {}
  String  *val_str(String *str);
  void fix_length_and_dec();
  const char *func_name() const { return "export_set"; }
};

unknown's avatar
unknown committed
628
class Item_func_inet_ntoa : public Item_str_func
unknown's avatar
unknown committed
629 630 631 632 633 634 635 636 637
{
public:
  Item_func_inet_ntoa(Item *a) :Item_str_func(a)
    {
    }
  String* val_str(String* str);
  const char *func_name() const { return "inet_ntoa"; }
  void fix_length_and_dec() { decimals = 0; max_length=3*8+7; }
};
unknown's avatar
unknown committed
638 639 640

class Item_func_quote :public Item_str_func
{
641
  String tmp_value;
unknown's avatar
unknown committed
642 643 644 645
public:
  Item_func_quote(Item *a) :Item_str_func(a) {}
  const char *func_name() const { return "quote"; }
  String *val_str(String *);
unknown's avatar
unknown committed
646 647
  void fix_length_and_dec()
  {
648
    collation.set(args[0]->collation);
unknown's avatar
unknown committed
649
    max_length= args[0]->max_length * 2 + 2;
650
  }
unknown's avatar
unknown committed
651
};
unknown's avatar
unknown committed
652

653 654
class Item_func_conv_charset :public Item_str_func
{
655
  bool use_cached_value;
656
public:
657
  bool safe;
658
  CHARSET_INFO *conv_charset; // keep it public
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
  Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) 
  { conv_charset= cs; use_cached_value= 0; safe= 0; }
  Item_func_conv_charset(Item *a, CHARSET_INFO *cs, bool cache_if_const) 
    :Item_str_func(a) 
  {
    DBUG_ASSERT(args[0]->fixed);
    conv_charset= cs;
    if (cache_if_const && args[0]->const_item())
    {
      uint errors= 0;
      String tmp, *str= args[0]->val_str(&tmp);
      if (!str || str_value.copy(str->ptr(), str->length(),
                                 str->charset(), conv_charset, &errors))
        null_value= 1;
      use_cached_value= 1;
      safe= (errors == 0);
    }
    else
    {
      use_cached_value= 0;
      /*
        Conversion from and to "binary" is safe.
        Conversion to Unicode is safe.
        Other kind of conversions are potentially lossy.
      */
      safe= (args[0]->collation.collation == &my_charset_bin ||
             cs == &my_charset_bin ||
             (cs->state & MY_CS_UNICODE));
    }
  }
689 690
  String *val_str(String *);
  void fix_length_and_dec();
691 692
  const char *func_name() const { return "convert"; }
  void print(String *str);
693 694
};

unknown's avatar
unknown committed
695 696 697
class Item_func_set_collation :public Item_str_func
{
public:
unknown's avatar
unknown committed
698
  Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {};
unknown's avatar
unknown committed
699
  String *val_str(String *);
700
  void fix_length_and_dec();
701
  bool eq(const Item *item, bool binary_cmp) const;
702
  const char *func_name() const { return "collate"; }
703
  enum Functype func_type() const { return COLLATE_FUNC; }
704
  void print(String *str);
705 706 707 708 709
  Item_field *filed_for_view_update()
  {
    /* this function is transparent for view updating */
    return args[0]->filed_for_view_update();
  }
unknown's avatar
unknown committed
710 711
};

unknown's avatar
unknown committed
712 713 714 715 716 717
class Item_func_charset :public Item_str_func
{
public:
  Item_func_charset(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  const char *func_name() const { return "charset"; }
unknown's avatar
unknown committed
718
  void fix_length_and_dec()
unknown's avatar
unknown committed
719
  {
720
     collation.set(system_charset_info);
721
     max_length= 64 * collation.collation->mbmaxlen; // should be enough
722
     maybe_null= 0;
unknown's avatar
unknown committed
723
  };
724
  table_map not_null_tables() const { return 0; }
unknown's avatar
unknown committed
725 726
};

unknown's avatar
unknown committed
727 728 729 730 731 732
class Item_func_collation :public Item_str_func
{
public:
  Item_func_collation(Item *a) :Item_str_func(a) {}
  String *val_str(String *);
  const char *func_name() const { return "collation"; }
733
  void fix_length_and_dec()
unknown's avatar
unknown committed
734
  {
735
     collation.set(system_charset_info);
736
     max_length= 64 * collation.collation->mbmaxlen; // should be enough
737
     maybe_null= 0;
unknown's avatar
unknown committed
738
  };
739
  table_map not_null_tables() const { return 0; }
unknown's avatar
unknown committed
740
};
741

742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
class Item_func_crc32 :public Item_int_func
{
  String value;
public:
  Item_func_crc32(Item *a) :Item_int_func(a) {}
  const char *func_name() const { return "crc32"; }
  void fix_length_and_dec() { max_length=10; }
  longlong val_int();
};

class Item_func_uncompressed_length : public Item_int_func
{
  String value;
public:
  Item_func_uncompressed_length(Item *a):Item_int_func(a){}
  const char *func_name() const{return "uncompressed_length";}
  void fix_length_and_dec() { max_length=10; }
  longlong val_int();
};

762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
#ifdef HAVE_COMPRESS
#define ZLIB_DEPENDED_FUNCTION ;
#else
#define ZLIB_DEPENDED_FUNCTION { null_value=1; return 0; }
#endif

class Item_func_compress: public Item_str_func
{
  String buffer;
public:
  Item_func_compress(Item *a):Item_str_func(a){}
  void fix_length_and_dec(){max_length= (args[0]->max_length*120)/100+12;}
  const char *func_name() const{return "compress";}
  String *val_str(String *) ZLIB_DEPENDED_FUNCTION
};

class Item_func_uncompress: public Item_str_func
{
  String buffer;
public:
  Item_func_uncompress(Item *a): Item_str_func(a){}
  void fix_length_and_dec(){max_length= MAX_BLOB_WIDTH;}
  const char *func_name() const{return "uncompress";}
  String *val_str(String *) ZLIB_DEPENDED_FUNCTION
};

unknown's avatar
unknown committed
788 789 790 791 792
#define UUID_LENGTH (8+1+4+1+4+1+4+1+12)
class Item_func_uuid: public Item_str_func
{
public:
  Item_func_uuid(): Item_str_func() {}
unknown's avatar
unknown committed
793 794
  void fix_length_and_dec() {
    collation.set(system_charset_info);
795 796 797 798 799 800
    /*
       NOTE! uuid() should be changed to use 'ascii'
       charset when hex(), format(), md5(), etc, and implicit
       number-to-string conversion will use 'ascii'
    */
    max_length= UUID_LENGTH * system_charset_info->mbmaxlen;
unknown's avatar
unknown committed
801
  }
unknown's avatar
unknown committed
802 803 804 805
  const char *func_name() const{ return "uuid"; }
  String *val_str(String *);
};