item_strfunc.h 23.1 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();
36
  my_decimal *val_decimal(my_decimal *);
unknown's avatar
unknown committed
37 38
  enum Item_result result_type () const { return STRING_RESULT; }
  void left_right_max_length();
39
  String *check_well_formed_result(String *str);
unknown's avatar
unknown committed
40 41 42 43 44 45 46 47 48 49
};

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"; }
50
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
51 52
};

53

54 55 56 57 58 59 60
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"; }	
61
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
};

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
83 84 85 86 87 88 89 90 91
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"; }
92
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
93 94 95 96 97 98
};

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

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();
112
  const char *func_name() const { return "reverse"; }
113
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
};


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
{
143 144 145 146 147
protected:
  uint multiply;
  uint (*converter)(CHARSET_INFO *cs, char *src, uint srclen,
                                      char *dst, uint dstlen);
  String tmp_value;
unknown's avatar
unknown committed
148 149
public:
  Item_str_conv(Item *item) :Item_str_func(item) {}
150
  String *val_str(String *);
151
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
152 153 154 155 156 157 158 159
};


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"; }
160 161 162 163 164 165 166
  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
167 168 169 170 171 172 173
};

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"; }
174 175 176 177 178 179 180
  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
181 182 183 184 185
};


class Item_func_left :public Item_str_func
{
186
  String tmp_value;
unknown's avatar
unknown committed
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
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"; }
215
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
216 217 218 219 220 221 222 223 224
};


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 *);
225
  void fix_length_and_dec();
226
  const char *func_name() const { return "substring_index"; }
227
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
228 229 230
};


231
class Item_func_trim :public Item_str_func
unknown's avatar
unknown committed
232
{
233
protected:
unknown's avatar
unknown committed
234
  String tmp_value;
235
  String remove;
unknown's avatar
unknown committed
236
public:
237 238
  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
239
  String *val_str(String *);
240 241
  void fix_length_and_dec();
  const char *func_name() const { return "trim"; }
242
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
243 244 245
};


246
class Item_func_ltrim :public Item_func_trim
unknown's avatar
unknown committed
247 248
{
public:
249 250
  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
251
  String *val_str(String *);
252
  const char *func_name() const { return "ltrim"; }
unknown's avatar
unknown committed
253 254
};

255 256

class Item_func_rtrim :public Item_func_trim
unknown's avatar
unknown committed
257 258
{
public:
259 260
  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
261
  String *val_str(String *);
262
  const char *func_name() const { return "rtrim"; }
unknown's avatar
unknown committed
263 264 265
};


266 267 268 269 270
/*
  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
271
  authentication procedure works, see comments in password.c.
272 273
*/

unknown's avatar
unknown committed
274 275
class Item_func_password :public Item_str_func
{
276
  char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH+1]; 
unknown's avatar
unknown committed
277 278
public:
  Item_func_password(Item *a) :Item_str_func(a) {}
279 280
  String *val_str(String *str);
  void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH; }
unknown's avatar
unknown committed
281
  const char *func_name() const { return "password"; }
unknown's avatar
unknown committed
282
  static char *alloc(THD *thd, const char *password);
unknown's avatar
unknown committed
283 284
};

285

286 287 288
/*
  Item_func_old_password -- PASSWORD() implementation used in MySQL 3.21 - 4.0
  compatibility mode. This item is created in sql_yacc.yy when
289
  'old_passwords' session variable is set, and to handle OLD_PASSWORD()
290 291 292
  function.
*/

293 294
class Item_func_old_password :public Item_str_func
{
295
  char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1];
296 297
public:
  Item_func_old_password(Item *a) :Item_str_func(a) {}
298 299
  String *val_str(String *str);
  void fix_length_and_dec() { max_length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; } 
300
  const char *func_name() const { return "old_password"; }
unknown's avatar
unknown committed
301
  static char *alloc(THD *thd, const char *password);
302 303 304
};


305 306 307 308 309 310 311
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
312 313
  void fix_length_and_dec()
  { maybe_null=1; max_length = args[0]->max_length+8; }
314
  const char *func_name() const { return "des_encrypt"; }
315 316 317 318 319 320 321 322 323
};

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 *);
324
  void fix_length_and_dec() { maybe_null=1; max_length = args[0]->max_length; }
325
  const char *func_name() const { return "des_decrypt"; }
326 327
};

unknown's avatar
unknown committed
328 329 330 331 332 333 334 335
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
336
  const char *func_name() const { return "encrypt"; }
unknown's avatar
unknown committed
337 338 339 340
};

#include "sql_crypt.h"

341

unknown's avatar
unknown committed
342 343 344 345 346 347 348 349 350
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();
351
  const char *func_name() const { return "encode"; }
unknown's avatar
unknown committed
352 353
};

354

unknown's avatar
unknown committed
355 356 357 358 359
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 *);
360
  const char *func_name() const { return "decode"; }
unknown's avatar
unknown committed
361 362 363
};


364
class Item_func_sysconst :public Item_str_func
unknown's avatar
unknown committed
365 366
{
public:
367 368 369
  Item_func_sysconst()
  { collation.set(system_charset_info,DERIVATION_SYSCONST); }
  Item *safe_charset_converter(CHARSET_INFO *tocs);
370 371 372 373 374 375
  /*
    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;
376 377
};

378

379 380 381 382
class Item_func_database :public Item_func_sysconst
{
public:
  Item_func_database() :Item_func_sysconst() {}
unknown's avatar
unknown committed
383
  String *val_str(String *);
unknown's avatar
unknown committed
384 385
  void fix_length_and_dec()
  {
386
    max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
unknown's avatar
unknown committed
387
    maybe_null=1;
388
  }
unknown's avatar
unknown committed
389
  const char *func_name() const { return "database"; }
390
  const char *fully_qualified_func_name() const { return "database()"; }
unknown's avatar
unknown committed
391 392
};

393

394
class Item_func_user :public Item_func_sysconst
unknown's avatar
unknown committed
395
{
396 397
  bool is_current;

unknown's avatar
unknown committed
398
public:
399 400
  Item_func_user(bool is_current_arg)
    :Item_func_sysconst(), is_current(is_current_arg) {}
unknown's avatar
unknown committed
401
  String *val_str(String *);
402 403 404 405
  void fix_length_and_dec()
  {
    max_length= ((USERNAME_LENGTH + HOSTNAME_LENGTH + 1) *
                 system_charset_info->mbmaxlen);
406
  }
407 408 409 410
  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
411 412 413 414 415
};


class Item_func_soundex :public Item_str_func
{
unknown's avatar
unknown committed
416
  String tmp_value;
unknown's avatar
unknown committed
417 418 419 420 421
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"; }
422
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
423 424 425 426 427 428
};


class Item_func_elt :public Item_str_func
{
public:
429
  Item_func_elt(List<Item> &list) :Item_str_func(list) {}
430
  double val_real();
unknown's avatar
unknown committed
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
  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);
446
  bool fix_fields(THD *thd, Item **ref)
unknown's avatar
unknown committed
447
  {
448
    DBUG_ASSERT(fixed == 0);
449
    return ((!item->fixed && item->fix_fields(thd, &item)) ||
unknown's avatar
unknown committed
450
	    item->check_cols(1) ||
451
	    Item_func::fix_fields(thd, ref));
unknown's avatar
unknown committed
452
  }
453
  void split_sum_func(THD *thd, Item **ref_pointer_array, List<Item> &fields);
unknown's avatar
unknown committed
454 455 456
  void fix_length_and_dec();
  void update_used_tables();
  const char *func_name() const { return "make_set"; }
unknown's avatar
unknown committed
457 458 459 460 461 462

  bool walk(Item_processor processor, byte *arg)
  {
    return item->walk(processor, arg) ||
      Item_str_func::walk(processor, arg);
  }
unknown's avatar
unknown committed
463
  Item *transform(Item_transformer transformer, byte *arg)
464
  {
unknown's avatar
unknown committed
465
    Item *new_item= item->transform(transformer, arg);
466 467 468
    if (!new_item)
      return 0;
    item= new_item;
unknown's avatar
unknown committed
469
    return Item_str_func::transform(transformer, arg);
470
  }
471
  void print(String *str);
unknown's avatar
unknown committed
472 473 474 475 476 477 478 479 480 481 482
};


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()
  {
483
    collation.set(default_charset());
484 485 486
    uint char_length= args[0]->max_length/args[0]->collation.collation->mbmaxlen;
    max_length= ((char_length + (char_length-args[0]->decimals)/3) *
                 collation.collation->mbmaxlen);
unknown's avatar
unknown committed
487 488
  }
  const char *func_name() const { return "format"; }
489
  void print(String *);
unknown's avatar
unknown committed
490 491 492 493 494 495
};


class Item_func_char :public Item_str_func
{
public:
496 497 498 499
  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
500
  String *val_str(String *);
501 502
  void fix_length_and_dec() 
  { 
503 504
    maybe_null=0;
    max_length=arg_count * collation.collation->mbmaxlen;
505
  }
unknown's avatar
unknown committed
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
  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
{
523
  String tmp_value, rpad_str;
unknown's avatar
unknown committed
524 525 526 527 528 529
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"; }
530
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
531 532 533 534 535
};


class Item_func_lpad :public Item_str_func
{
536
  String tmp_value, lpad_str;
unknown's avatar
unknown committed
537 538 539 540 541 542
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"; }
543
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
544 545 546 547 548 549 550 551 552
};


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
553 554
  void fix_length_and_dec()
  {
555
    collation.set(default_charset());
556
    max_length= 64;
557
  }
558
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
559 560
};

unknown's avatar
unknown committed
561 562 563 564 565 566 567 568

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
569 570
  void fix_length_and_dec()
  {
571
    collation.set(default_charset());
unknown's avatar
unknown committed
572 573
    decimals=0;
    max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
574
  }
575
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
576 577
};

unknown's avatar
unknown committed
578 579 580 581 582 583 584 585 586 587 588 589 590
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;
  }
591
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
592 593
};

unknown's avatar
unknown committed
594

unknown's avatar
unknown committed
595 596 597 598
class Item_func_binary :public Item_str_func
{
public:
  Item_func_binary(Item *a) :Item_str_func(a) {}
599
  String *val_str(String *a)
unknown's avatar
unknown committed
600
  {
601
    DBUG_ASSERT(fixed == 1);
unknown's avatar
unknown committed
602 603
    String *tmp=args[0]->val_str(a);
    null_value=args[0]->null_value;
604 605
    if (tmp)
      tmp->set_charset(&my_charset_bin);
unknown's avatar
unknown committed
606
    return tmp;
unknown's avatar
unknown committed
607
  }
unknown's avatar
unknown committed
608 609 610 611
  void fix_length_and_dec()
  {
    collation.set(&my_charset_bin);
    max_length=args[0]->max_length;
612
  }
613
  void print(String *str);
614
  const char *func_name() const { return "cast_as_binary"; }
615
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
616 617 618 619 620 621 622 623 624 625 626
};


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
627
  {
628
    collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
unknown's avatar
unknown committed
629
    maybe_null=1;
630 631
    max_length=MAX_BLOB_WIDTH;
  }
unknown's avatar
unknown committed
632 633 634 635 636 637 638 639 640 641 642 643 644 645
};


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
646
class Item_func_inet_ntoa : public Item_str_func
unknown's avatar
unknown committed
647 648 649 650 651 652 653 654
{
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; }
655
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
656
};
unknown's avatar
unknown committed
657 658 659

class Item_func_quote :public Item_str_func
{
660
  String tmp_value;
unknown's avatar
unknown committed
661 662 663 664
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
665 666
  void fix_length_and_dec()
  {
667
    collation.set(args[0]->collation);
unknown's avatar
unknown committed
668
    max_length= args[0]->max_length * 2 + 2;
669
  }
670
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
671
};
unknown's avatar
unknown committed
672

673 674
class Item_func_conv_charset :public Item_str_func
{
675
  bool use_cached_value;
676
public:
677
  bool safe;
678
  CHARSET_INFO *conv_charset; // keep it public
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
  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));
    }
  }
709 710
  String *val_str(String *);
  void fix_length_and_dec();
711 712
  const char *func_name() const { return "convert"; }
  void print(String *str);
713
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
714 715
};

unknown's avatar
unknown committed
716 717 718
class Item_func_set_collation :public Item_str_func
{
public:
unknown's avatar
unknown committed
719
  Item_func_set_collation(Item *a, Item *b) :Item_str_func(a,b) {};
unknown's avatar
unknown committed
720
  String *val_str(String *);
721
  void fix_length_and_dec();
722
  bool eq(const Item *item, bool binary_cmp) const;
723
  const char *func_name() const { return "collate"; }
724
  enum Functype func_type() const { return COLLATE_FUNC; }
725
  void print(String *str);
726 727 728 729 730
  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
731 732
};

unknown's avatar
unknown committed
733 734 735 736 737 738
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
739
  void fix_length_and_dec()
unknown's avatar
unknown committed
740
  {
741
     collation.set(system_charset_info);
742
     max_length= 64 * collation.collation->mbmaxlen; // should be enough
743
     maybe_null= 0;
unknown's avatar
unknown committed
744
  };
745
  table_map not_null_tables() const { return 0; }
746
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
747 748
};

unknown's avatar
unknown committed
749 750 751 752 753 754
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"; }
755
  void fix_length_and_dec()
unknown's avatar
unknown committed
756
  {
757
     collation.set(system_charset_info);
758
     max_length= 64 * collation.collation->mbmaxlen; // should be enough
759
     maybe_null= 0;
unknown's avatar
unknown committed
760
  };
761
  table_map not_null_tables() const { return 0; }
762
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
unknown's avatar
unknown committed
763
};
764

765 766 767 768 769 770 771 772
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();
773
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
774 775 776 777 778 779 780 781 782 783
};

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();
784
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
785 786
};

787 788 789 790 791 792 793 794 795 796 797 798 799 800
#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
801
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
802 803 804 805 806 807 808 809 810 811
};

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
812
  bool check_partition_func_processor(byte *bool_arg) { return 0;}
813 814
};

unknown's avatar
unknown committed
815 816 817 818 819
#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
820 821
  void fix_length_and_dec() {
    collation.set(system_charset_info);
822 823 824 825 826 827
    /*
       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
828
  }
unknown's avatar
unknown committed
829 830 831 832
  const char *func_name() const{ return "uuid"; }
  String *val_str(String *);
};