item_strfunc.cc
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:40k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* This file defines all string functions
  17. ** Warning: Some string functions doesn't always put and end-null on a String
  18. ** (This shouldn't be neaded)
  19. */
  20. #ifdef __GNUC__
  21. #pragma implementation // gcc: Class implementation
  22. #endif
  23. #include "mysql_priv.h"
  24. #include "sql_acl.h"
  25. #include <m_ctype.h>
  26. #ifdef HAVE_CRYPT_H
  27. #include <crypt.h>
  28. #endif
  29. #include "md5.h"
  30. String empty_string("");
  31. uint nr_of_decimals(const char *str)
  32. {
  33.   if ((str=strchr(str,'.')))
  34.   {
  35.     const char *start= ++str;
  36.     for ( ; isdigit(*str) ; str++) ;
  37.     return (uint) (str-start);
  38.   }
  39.   return 0;
  40. }
  41. double Item_str_func::val()
  42. {
  43.   String *res;
  44.   res=val_str(&str_value);
  45.   return res ? atof(res->c_ptr()) : 0.0;
  46. }
  47. longlong Item_str_func::val_int()
  48. {
  49.   String *res;
  50.   res=val_str(&str_value);
  51.   return res ? strtoll(res->c_ptr(),NULL,10) : (longlong) 0;
  52. }
  53. String *Item_func_md5::val_str(String *str)
  54. {
  55.   String * sptr= args[0]->val_str(str);
  56.   if (sptr)
  57.   {
  58.     MD5_CTX context;
  59.     unsigned char digest[16];
  60.     null_value=0;
  61.     MD5Init (&context);
  62.     MD5Update (&context,(unsigned char *) sptr->ptr(), sptr->length());
  63.     MD5Final (digest, &context);
  64.     str->alloc(32); // Ensure that memory is free
  65.     sprintf((char *) str->ptr(),
  66.     "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
  67.     digest[0], digest[1], digest[2], digest[3],
  68.     digest[4], digest[5], digest[6], digest[7],
  69.     digest[8], digest[9], digest[10], digest[11],
  70.     digest[12], digest[13], digest[14], digest[15]);
  71.     str->length((uint) 32);
  72.     return str;
  73.   }
  74.   null_value=1;
  75.   return 0;
  76. }
  77. void Item_func_md5::fix_length_and_dec()
  78. {
  79.    max_length=32;
  80. }
  81. /*
  82. ** Concatinate args with the following premissess
  83. ** If only one arg which is ok, return value of arg
  84. ** Don't reallocate val_str() if not absolute necessary.
  85. */
  86. String *Item_func_concat::val_str(String *str)
  87. {
  88.   String *res,*res2,*use_as_buff;
  89.   uint i;
  90.   null_value=0;
  91.   if (!(res=args[0]->val_str(str)))
  92.     goto null;
  93.   use_as_buff= &tmp_value;
  94.   for (i=1 ; i < arg_count ; i++)
  95.   {
  96.     if (res->length() == 0)
  97.     {
  98.       if (!(res=args[i]->val_str(str)))
  99. goto null;
  100.     }
  101.     else
  102.     {
  103.       if (!(res2=args[i]->val_str(use_as_buff)))
  104. goto null;
  105.       if (res2->length() == 0)
  106. continue;
  107.       if (res->length()+res2->length() > max_allowed_packet)
  108. goto null; // Error check
  109.       if (res->alloced_length() >= res->length()+res2->length())
  110.       { // Use old buffer
  111. res->append(*res2);
  112.       }
  113.       else if (str->alloced_length() >= res->length()+res2->length())
  114.       {
  115. if (str == res2)
  116.   str->replace(0,0,*res);
  117. else
  118. {
  119.   str->copy(*res);
  120.   str->append(*res2);
  121. }
  122. res=str;
  123.       }
  124.       else if (res == &tmp_value)
  125.       {
  126. if (res->append(*res2)) // Must be a blob
  127.   goto null;
  128.       }
  129.       else if (res2 == &tmp_value)
  130.       { // This can happend only 1 time
  131. if (tmp_value.replace(0,0,*res))
  132.   goto null;
  133. res= &tmp_value;
  134. use_as_buff=str; // Put next arg here
  135.       }
  136.       else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
  137.        res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length())
  138.       {
  139. /*
  140.   This happens really seldom:
  141.   In this case res2 is sub string of tmp_value.  We will
  142.   now work in place in tmp_value to set it to res | res2
  143. */
  144. /* Chop the last characters in tmp_value that isn't in res2 */
  145. tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) +
  146.  res2->length());
  147. /* Place res2 at start of tmp_value, remove chars before res2 */
  148. if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()),
  149.       *res))
  150.   goto null;
  151. res= &tmp_value;
  152. use_as_buff=str; // Put next arg here
  153.       }
  154.       else
  155.       { // Two big const strings
  156. if (tmp_value.alloc(max_length) ||
  157.     tmp_value.copy(*res) ||
  158.     tmp_value.append(*res2))
  159.   goto null;
  160. res= &tmp_value;
  161. use_as_buff=str;
  162.       }
  163.     }
  164.   }
  165.   return res;
  166. null:
  167.   null_value=1;
  168.   return 0;
  169. }
  170. void Item_func_concat::fix_length_and_dec()
  171. {
  172.   max_length=0;
  173.   for (uint i=0 ; i < arg_count ; i++)
  174.     max_length+=args[i]->max_length;
  175.   if (max_length > MAX_BLOB_WIDTH)
  176.   {
  177.     max_length=MAX_BLOB_WIDTH;
  178.     maybe_null=1;
  179.   }
  180. }
  181. /* 
  182. ** concat with separator. First arg is the separator
  183. ** concat_ws takes at least two arguments.
  184. */
  185. String *Item_func_concat_ws::val_str(String *str)
  186. {
  187.   char tmp_str_buff[10];
  188.   String tmp_sep_str(tmp_str_buff, sizeof(tmp_str_buff)),
  189.          *sep_str, *res, *res2,*use_as_buff;
  190.   uint i;
  191.   null_value=0;
  192.   if (!(sep_str= separator->val_str(&tmp_sep_str)))
  193.     goto null;
  194.   use_as_buff= &tmp_value;
  195.   str->length(0);
  196.   res=str;
  197.   // Skip until non-null and non-empty argument is found.
  198.   // If not, return the empty string
  199.   for (i=0; !(res= args[i]->val_str(str)) || !res->length(); i++)
  200.   {
  201.     if ((i + 1) == arg_count)
  202.       return &empty_string;
  203.   }
  204.   for (i++; i < arg_count ; i++)
  205.   {
  206.     if (!(res2= args[i]->val_str(use_as_buff)) || !res2->length())
  207.       continue;
  208.     else
  209.     {
  210.       if (res->length() + sep_str->length() + res2->length() >
  211.   max_allowed_packet)
  212. goto null; // Error check
  213.       if (res->alloced_length() >=
  214.   res->length() + sep_str->length() + res2->length())
  215.       { // Use old buffer
  216. res->append(*sep_str);                  // res->length() > 0 always
  217. res->append(*res2);
  218. use_as_buff= &tmp_value;
  219.       }
  220.       else if (str->alloced_length() >=
  221.        res->length() + sep_str->length() + res2->length())
  222.       {
  223. str->copy(*res);
  224. str->append(*sep_str);
  225. str->append(*res2);
  226. res=str;
  227. use_as_buff= &tmp_value;
  228.       }
  229.       else if (res == &tmp_value)
  230.       {
  231. if ((res->length() && res->append(*sep_str)) || res->append(*res2))
  232.   goto null; // Must be a blob
  233.       }
  234.       else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
  235.             res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length())
  236.       {
  237.      /*
  238.        This happens really seldom:
  239.        In this case res2 is sub string of tmp_value.  We will
  240.        now work in place in tmp_value to set it to res | res2
  241.      */
  242.      /* Chop the last characters in tmp_value that isn't in res2 */
  243.      tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) +
  244.       res2->length());
  245.      /* Place res2 at start of tmp_value, remove chars before res2 */
  246. if (res->append(*sep_str))
  247.   goto null;
  248.      if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()),
  249.            *res))
  250.        goto null;
  251.      res= &tmp_value;
  252.      use_as_buff=str; // Put next arg here
  253.       }
  254.       else
  255.       { // Two big const strings
  256. if (tmp_value.alloc(max_length) ||
  257.     tmp_value.copy(*res) ||
  258.     tmp_value.append(*sep_str) ||
  259.     tmp_value.append(*res2))
  260.   goto null;
  261. res= &tmp_value;
  262. use_as_buff=str;
  263.       }
  264.     }
  265.   }
  266.   return res;
  267. null:
  268.   null_value=1;
  269.   return 0;
  270. }
  271. void Item_func_concat_ws::fix_length_and_dec()
  272. {
  273.   max_length=0;
  274.   for (uint i=0 ; i < arg_count ; i++)
  275.     max_length+=args[i]->max_length;
  276.   if (max_length > MAX_BLOB_WIDTH)
  277.   {
  278.     max_length=MAX_BLOB_WIDTH;
  279.     maybe_null=1;
  280.   }
  281.   used_tables_cache|=separator->used_tables();
  282.   const_item_cache&=separator->const_item();
  283. }
  284. void Item_func_concat_ws::update_used_tables()
  285. {
  286.   Item_func::update_used_tables();
  287.   separator->update_used_tables();
  288.   used_tables_cache|=separator->used_tables();
  289.   const_item_cache&=separator->const_item();
  290. }
  291. String *Item_func_reverse::val_str(String *str)
  292. {
  293.   String *res = args[0]->val_str(str);
  294.   char *ptr,*end;
  295.   if ((null_value=args[0]->null_value))
  296.     return 0;
  297.   /* An empty string is a special case as the string pointer may be null */
  298.   if (!res->length())
  299.     return &empty_string;
  300.   res=copy_if_not_alloced(str,res,res->length());
  301.   ptr = (char *) res->ptr();
  302.   end=ptr+res->length();
  303. #ifdef USE_MB
  304.   if (use_mb(default_charset_info) && !binary)
  305.   {
  306.     String tmpstr;
  307.     tmpstr.copy(*res);
  308.     char *tmp = (char *) tmpstr.ptr() + tmpstr.length();
  309.     register uint32 l;
  310.     while (ptr < end)
  311.     {
  312.       if ((l=my_ismbchar(default_charset_info, ptr,end)))
  313.         tmp-=l, memcpy(tmp,ptr,l), ptr+=l;
  314.       else
  315.         *--tmp=*ptr++;
  316.     }
  317.     memcpy((char *) res->ptr(),(char *) tmpstr.ptr(), res->length());
  318.   }
  319.   else
  320. #endif /* USE_MB */
  321.   {
  322.     char tmp;
  323.     while (ptr < end)
  324.     {
  325.       tmp=*ptr;
  326.       *ptr++=*--end;
  327.       *end=tmp;
  328.     }
  329.   }
  330.   return res;
  331. }
  332. void Item_func_reverse::fix_length_and_dec()
  333. {
  334.   max_length = args[0]->max_length;
  335. }
  336. /*
  337. ** Replace all occurences of string2 in string1 with string3.
  338. ** Don't reallocate val_str() if not neaded
  339. */
  340. /* TODO: Fix that this works with binary strings when using USE_MB */
  341. String *Item_func_replace::val_str(String *str)
  342. {
  343.   String *res,*res2,*res3;
  344.   int offset=0;
  345.   uint from_length,to_length;
  346.   bool alloced=0;
  347. #ifdef USE_MB
  348.   const char *ptr,*end,*strend,*search,*search_end;
  349.   register uint32 l;
  350. #endif
  351.   null_value=0;
  352.   res=args[0]->val_str(str);
  353.   if (args[0]->null_value)
  354.     goto null;
  355.   res2=args[1]->val_str(&tmp_value);
  356.   if (args[1]->null_value)
  357.     goto null;
  358.   if (res2->length() == 0)
  359.     return res;
  360. #ifndef USE_MB
  361.   if ((offset=res->strstr(*res2)) < 0)
  362.     return res;
  363. #else
  364.   if (!use_mb(default_charset_info) && (offset=res->strstr(*res2)) < 0)
  365.     return res;
  366. #endif
  367.   if (!(res3=args[2]->val_str(&tmp_value2)))
  368.     goto null;
  369.   from_length= res2->length();
  370.   to_length=   res3->length();
  371. #ifdef USE_MB
  372.   if (use_mb(default_charset_info))
  373.   {
  374.     search=res2->ptr();
  375.     search_end=search+from_length;
  376. redo:
  377.     ptr=res->ptr()+offset;
  378.     strend=res->ptr()+res->length();
  379.     end=strend-from_length+1;
  380.     while (ptr < end)
  381.     {
  382.         if (*ptr == *search)
  383.         {
  384.           register char *i,*j;
  385.           i=(char*) ptr+1; j=(char*) search+1;
  386.           while (j != search_end)
  387.             if (*i++ != *j++) goto skipp;
  388.           offset= (int) (ptr-res->ptr());
  389.           if (res->length()-from_length + to_length > max_allowed_packet)
  390.             goto null;
  391.           if (!alloced)
  392.           {
  393.             alloced=1;
  394.             res=copy_if_not_alloced(str,res,res->length()+to_length);
  395.           }
  396.           res->replace((uint) offset,from_length,*res3);
  397.           goto redo;
  398.         }
  399. skipp:
  400.         if ((l=my_ismbchar(default_charset_info, ptr,strend))) ptr+=l;
  401.         else ++ptr;
  402.     }
  403.   }
  404.   else
  405. #endif /* USE_MB */
  406.     do
  407.     {
  408.       if (res->length()-from_length + to_length > max_allowed_packet)
  409.         goto null;
  410.       if (!alloced)
  411.       {
  412.         alloced=1;
  413.         res=copy_if_not_alloced(str,res,res->length()+to_length);
  414.       }
  415.       res->replace((uint) offset,from_length,*res3);
  416.       offset+=(int) to_length;
  417.     }
  418.     while ((offset=res->strstr(*res2,(uint) offset)) >= 0);
  419.   return res;
  420. null:
  421.   null_value=1;
  422.   return 0;
  423. }
  424. void Item_func_replace::fix_length_and_dec()
  425. {
  426.   max_length=args[0]->max_length;
  427.   int diff=(int) (args[2]->max_length - args[1]->max_length);
  428.   if (diff > 0 && args[1]->max_length)
  429.   { // Calculate of maxreplaces
  430.     max_length= max_length/args[1]->max_length;
  431.     max_length= (max_length+1)*(uint) diff;
  432.   }
  433.   if (max_length > MAX_BLOB_WIDTH)
  434.   {
  435.     max_length=MAX_BLOB_WIDTH;
  436.     maybe_null=1;
  437.   }
  438. }
  439. String *Item_func_insert::val_str(String *str)
  440. {
  441.   String *res,*res2;
  442.   uint start,length;
  443.   null_value=0;
  444.   res=args[0]->val_str(str);
  445.   res2=args[3]->val_str(&tmp_value);
  446.   start=(uint) args[1]->val_int()-1;
  447.   length=(uint) args[2]->val_int();
  448.   if (args[0]->null_value || args[1]->null_value || args[2]->null_value ||
  449.       args[3]->null_value)
  450.     goto null; /* purecov: inspected */
  451. #ifdef USE_MB
  452.   if (use_mb(default_charset_info) && !args[0]->binary)
  453.   {
  454.     start=res->charpos(start);
  455.     length=res->charpos(length,start);
  456.   }
  457. #endif
  458.   if (start > res->length()+1)
  459.     return res; // Wrong param; skipp insert
  460.   if (length > res->length()-start)
  461.     length=res->length()-start;
  462.   if (res->length() - length + res2->length() > max_allowed_packet)
  463.     goto null; // OOM check
  464.   res=copy_if_not_alloced(str,res,res->length());
  465.   res->replace(start,length,*res2);
  466.   return res;
  467. null:
  468.   null_value=1;
  469.   return 0;
  470. }
  471. void Item_func_insert::fix_length_and_dec()
  472. {
  473.   max_length=args[0]->max_length+args[3]->max_length;
  474.   if (max_length > MAX_BLOB_WIDTH)
  475.   {
  476.     max_length=MAX_BLOB_WIDTH;
  477.     maybe_null=1;
  478.   }
  479. }
  480. String *Item_func_lcase::val_str(String *str)
  481. {
  482.   String *res;
  483.   if (!(res=args[0]->val_str(str)))
  484.   {
  485.     null_value=1; /* purecov: inspected */
  486.     return 0; /* purecov: inspected */
  487.   }
  488.   null_value=0;
  489.   res=copy_if_not_alloced(str,res,res->length());
  490.   res->casedn();
  491.   return res;
  492. }
  493. String *Item_func_ucase::val_str(String *str)
  494. {
  495.   String *res;
  496.   if (!(res=args[0]->val_str(str)))
  497.   {
  498.     null_value=1; /* purecov: inspected */
  499.     return 0; /* purecov: inspected */
  500.   }
  501.   null_value=0;
  502.   res=copy_if_not_alloced(str,res,res->length());
  503.   res->caseup();
  504.   return res;
  505. }
  506. String *Item_func_left::val_str(String *str)
  507. {
  508.   String *res  =args[0]->val_str(str);
  509.   long length  =(long) args[1]->val_int();
  510.   if ((null_value=args[0]->null_value))
  511.     return 0;
  512.   if (length <= 0)
  513.     return &empty_string;
  514. #ifdef USE_MB
  515.   if (use_mb(default_charset_info) && !binary)
  516.     length = res->charpos(length);
  517. #endif
  518.   if (res->length() > (ulong) length)
  519.   { // Safe even if const arg
  520.     if (!res->alloced_length())
  521.     { // Don't change const str
  522.       str_value= *res; // Not malloced string
  523.       res= &str_value;
  524.     }
  525.     res->length((uint) length);
  526.   }
  527.   return res;
  528. }
  529. void Item_str_func::left_right_max_length()
  530. {
  531.   max_length=args[0]->max_length;
  532.   if (args[1]->const_item())
  533.   {
  534.     int length=(int) args[1]->val_int();
  535.     if (length <= 0)
  536.       max_length=0;
  537.     else
  538.       set_if_smaller(max_length,(uint) length);
  539.   }
  540. }
  541. void Item_func_left::fix_length_and_dec()
  542. {
  543.   left_right_max_length();
  544. }
  545. String *Item_func_right::val_str(String *str)
  546. {
  547.   String *res  =args[0]->val_str(str);
  548.   long length  =(long) args[1]->val_int();
  549.   if ((null_value=args[0]->null_value))
  550.     return 0; /* purecov: inspected */
  551.   if (length <= 0)
  552.     return &empty_string; /* purecov: inspected */
  553.   if (res->length() <= (uint) length)
  554.     return res; /* purecov: inspected */
  555. #ifdef USE_MB
  556.   if (use_mb(default_charset_info) && !binary)
  557.   {
  558.     uint start=res->numchars()-(uint) length;
  559.     if (start<=0) return res;
  560.     start=res->charpos(start);
  561.     tmp_value.set(*res,start,res->length()-start);
  562.   }
  563.   else
  564. #endif
  565.   {
  566.     tmp_value.set(*res,(res->length()- (uint) length),(uint) length);
  567.   }
  568.   return &tmp_value;
  569. }
  570. void Item_func_right::fix_length_and_dec()
  571. {
  572.   left_right_max_length();
  573. }
  574. String *Item_func_substr::val_str(String *str)
  575. {
  576.   String *res  = args[0]->val_str(str);
  577.   int32 start = (int32) args[1]->val_int()-1;
  578.   int32 length = arg_count == 3 ? (int32) args[2]->val_int() : INT_MAX32;
  579.   int32 tmp_length;
  580.   if ((null_value=(args[0]->null_value || args[1]->null_value ||
  581.    (arg_count == 3 && args[2]->null_value))))
  582.     return 0; /* purecov: inspected */
  583. #ifdef USE_MB
  584.   if (use_mb(default_charset_info) && !binary)
  585.   {
  586.     start=res->charpos(start);
  587.     length=res->charpos(length,start);
  588.   }
  589. #endif
  590.   if (start < 0 || (uint) start+1 > res->length() || length <= 0)
  591.     return &empty_string;
  592.   tmp_length=(int32) res->length()-start;
  593.   length=min(length,tmp_length);
  594.   if (!start && res->length() == (uint) length)
  595.     return res;
  596.   tmp_value.set(*res,(uint) start,(uint) length);
  597.   return &tmp_value;
  598. }
  599. void Item_func_substr::fix_length_and_dec()
  600. {
  601.   max_length=args[0]->max_length;
  602.   if (args[1]->const_item())
  603.   {
  604.     int32 start=(int32) args[1]->val_int()-1;
  605.     if (start < 0 || start >= (int32) max_length)
  606.       max_length=0; /* purecov: inspected */
  607.     else
  608.       max_length-= (uint) start;
  609.   }
  610.   if (arg_count == 3 && args[2]->const_item())
  611.   {
  612.     int32 length= (int32) args[2]->val_int();
  613.     if (length <= 0)
  614.       max_length=0; /* purecov: inspected */
  615.     else
  616.       set_if_smaller(max_length,(uint) length);
  617.   }
  618. }
  619. String *Item_func_substr_index::val_str(String *str)
  620. {
  621.   String *res =args[0]->val_str(str);
  622.   String *delimeter =args[1]->val_str(&tmp_value);
  623.   int32 count = (int32) args[2]->val_int();
  624.   uint offset;
  625.   if (args[0]->null_value || args[1]->null_value || args[2]->null_value)
  626.   { // string and/or delim are null
  627.     null_value=1;
  628.     return 0;
  629.   }
  630.   null_value=0;
  631.   uint delimeter_length=delimeter->length();
  632.   if (!res->length() || !delimeter_length || !count)
  633.     return &empty_string; // Wrong parameters
  634. #ifdef USE_MB
  635.   if (use_mb(default_charset_info) && !binary)
  636.   {
  637.     const char *ptr=res->ptr();
  638.     const char *strend = ptr+res->length();
  639.     const char *end=strend-delimeter_length+1;
  640.     const char *search=delimeter->ptr();
  641.     const char *search_end=search+delimeter_length;
  642.     int32 n=0,c=count,pass;
  643.     register uint32 l;
  644.     for (pass=(count>0);pass<2;++pass)
  645.     {
  646.       while (ptr < end)
  647.       {
  648.         if (*ptr == *search)
  649.         {
  650.   register char *i,*j;
  651.   i=(char*) ptr+1; j=(char*) search+1;
  652.   while (j != search_end)
  653.     if (*i++ != *j++) goto skipp;
  654.   if (pass==0) ++n;
  655.   else if (!--c) break;
  656.   ptr+=delimeter_length;
  657.   continue;
  658. }
  659.     skipp:
  660.         if ((l=my_ismbchar(default_charset_info, ptr,strend))) ptr+=l;
  661.         else ++ptr;
  662.       } /* either not found or got total number when count<0 */
  663.       if (pass == 0) /* count<0 */
  664.       {
  665.         c+=n+1;
  666.         if (c<=0) return res; /* not found, return original string */
  667.         ptr=res->ptr();
  668.       }
  669.       else
  670.       {
  671.         if (c) return res; /* Not found, return original string */
  672.         if (count>0) /* return left part */
  673.         {
  674.   tmp_value.set(*res,0,(ulong) (ptr-res->ptr()));
  675.         }
  676.         else /* return right part */
  677.         {
  678.   ptr+=delimeter_length;
  679.   tmp_value.set(*res,(ulong) (ptr-res->ptr()), (ulong) (strend-ptr));
  680.         }
  681.       }
  682.     }
  683.   }
  684.   else
  685. #endif /* USE_MB */
  686.   {
  687.     if (count > 0)
  688.     { // start counting from the beginning
  689.       for (offset=0 ;; offset+=delimeter_length)
  690.       {
  691. if ((int) (offset=res->strstr(*delimeter,offset)) < 0)
  692.   return res; // Didn't find, return org string
  693. if (!--count)
  694. {
  695.   tmp_value.set(*res,0,offset);
  696.   break;
  697. }
  698.       }
  699.     }
  700.     else
  701.     { // Start counting at end
  702.       for (offset=res->length() ; ; offset-=delimeter_length-1)
  703.       {
  704. if ((int) (offset=res->strrstr(*delimeter,offset)) < 0)
  705.   return res; // Didn't find, return org string
  706. if (!++count)
  707. {
  708.   offset+=delimeter_length;
  709.   tmp_value.set(*res,offset,res->length()- offset);
  710.   break;
  711. }
  712.       }
  713.     }
  714.   }
  715.   return (&tmp_value);
  716. }
  717. /*
  718. ** The trim functions are extension to ANSI SQL because they trim substrings
  719. ** They ltrim() and rtrim() functions are optimized for 1 byte strings
  720. ** They also return the original string if possible, else they return
  721. ** a substring that points at the original string.
  722. */
  723. String *Item_func_ltrim::val_str(String *str)
  724. {
  725.   String *res  =args[0]->val_str(str);
  726.   if ((null_value=args[0]->null_value))
  727.     return 0; /* purecov: inspected */
  728.   char buff[MAX_FIELD_WIDTH];
  729.   String tmp(buff,sizeof(buff));
  730.   String *remove_str=args[1]->val_str(&tmp);
  731.   uint remove_length;
  732.   LINT_INIT(remove_length);
  733.   if (!remove_str || (remove_length=remove_str->length()) == 0 ||
  734.       remove_length > res->length())
  735.     return res;
  736.   char *ptr=(char*) res->ptr();
  737.   char *end=ptr+res->length();
  738.   if (remove_length == 1)
  739.   {
  740.     char chr=(*remove_str)[0];
  741.     while (ptr != end && *ptr == chr)
  742.       ptr++;
  743.   }
  744.   else
  745.   {
  746.     const char *r_ptr=remove_str->ptr();
  747.     end-=remove_length;
  748.     while (ptr < end && !memcmp(ptr,r_ptr,remove_length))
  749.       ptr+=remove_length;
  750.     end+=remove_length;
  751.   }
  752.   if (ptr == res->ptr())
  753.     return res;
  754.   tmp_value.set(*res,(uint) (ptr - res->ptr()),(uint) (end-ptr));
  755.   return &tmp_value;
  756. }
  757. String *Item_func_rtrim::val_str(String *str)
  758. {
  759.   String *res  =args[0]->val_str(str);
  760.   if ((null_value=args[0]->null_value))
  761.     return 0; /* purecov: inspected */
  762.   char buff[MAX_FIELD_WIDTH];
  763.   String tmp(buff,sizeof(buff));
  764.   String *remove_str=args[1]->val_str(&tmp);
  765.   uint remove_length;
  766.   LINT_INIT(remove_length);
  767.   if (!remove_str || (remove_length=remove_str->length()) == 0 ||
  768.       remove_length > res->length())
  769.     return res;
  770.   char *ptr=(char*) res->ptr();
  771.   char *end=ptr+res->length();
  772. #ifdef USE_MB
  773.   char *p=ptr;
  774.   register uint32 l;
  775. #endif
  776.   if (remove_length == 1)
  777.   {
  778.     char chr=(*remove_str)[0];
  779. #ifdef USE_MB
  780.     if (use_mb(default_charset_info) && !binary)
  781.     {
  782.       while (ptr < end)
  783.       {
  784. if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l,p=ptr;
  785. else ++ptr;
  786.       }
  787.       ptr=p;
  788.     }
  789. #endif
  790.     while (ptr != end  && end[-1] == chr)
  791.       end--;
  792.   }
  793.   else
  794.   {
  795.     const char *r_ptr=remove_str->ptr();
  796. #ifdef USE_MB
  797.     if (use_mb(default_charset_info) && !binary)
  798.     {
  799.   loop:
  800.       while (ptr + remove_length < end)
  801.       {
  802. if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l;
  803. else ++ptr;
  804.       }
  805.       if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length))
  806.       {
  807. end-=remove_length;
  808. ptr=p;
  809. goto loop;
  810.       }
  811.     }
  812.     else
  813. #endif /* USE_MB */
  814.     {
  815.       while (ptr + remove_length < end &&
  816.      !memcmp(end-remove_length,r_ptr,remove_length))
  817. end-=remove_length;
  818.     }
  819.   }
  820.   if (end == res->ptr()+res->length())
  821.     return res;
  822.   tmp_value.set(*res,0,(uint) (end-res->ptr()));
  823.   return &tmp_value;
  824. }
  825. String *Item_func_trim::val_str(String *str)
  826. {
  827.   String *res  =args[0]->val_str(str);
  828.   if ((null_value=args[0]->null_value))
  829.     return 0; /* purecov: inspected */
  830.   char buff[MAX_FIELD_WIDTH];
  831.   String tmp(buff,sizeof(buff));
  832.   String *remove_str=args[1]->val_str(&tmp);
  833.   uint remove_length;
  834.   LINT_INIT(remove_length);
  835.   if (!remove_str || (remove_length=remove_str->length()) == 0 ||
  836.       remove_length > res->length())
  837.     return res;
  838.   char *ptr=(char*) res->ptr();
  839.   char *end=ptr+res->length();
  840.   const char *r_ptr=remove_str->ptr();
  841.   while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length))
  842.     ptr+=remove_length;
  843. #ifdef USE_MB
  844.   if (use_mb(default_charset_info) && !binary)
  845.   {
  846.     char *p=ptr;
  847.     register uint32 l;
  848.  loop:
  849.     while (ptr + remove_length < end)
  850.     {
  851.       if ((l=my_ismbchar(default_charset_info, ptr,end))) ptr+=l;
  852.       else ++ptr;
  853.     }
  854.     if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length))
  855.     {
  856.       end-=remove_length;
  857.       ptr=p;
  858.       goto loop;
  859.     }
  860.     ptr=p;
  861.   }
  862.   else
  863. #endif /* USE_MB */
  864.   {
  865.     while (ptr + remove_length <= end &&
  866.    !memcmp(end-remove_length,r_ptr,remove_length))
  867.       end-=remove_length;
  868.   }
  869.   if (ptr == res->ptr() && end == ptr+res->length())
  870.     return res;
  871.   tmp_value.set(*res,(uint) (ptr - res->ptr()),(uint) (end-ptr));
  872.   return &tmp_value;
  873. }
  874. String *Item_func_password::val_str(String *str)
  875. {
  876.   String *res  =args[0]->val_str(str);
  877.   if ((null_value=args[0]->null_value))
  878.     return 0;
  879.   if (res->length() == 0)
  880.     return &empty_string;
  881.   make_scrambled_password(tmp_value,res->c_ptr());
  882.   str->set(tmp_value,16);
  883.   return str;
  884. }
  885. #define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
  886. String *Item_func_encrypt::val_str(String *str)
  887. {
  888.   String *res  =args[0]->val_str(str);
  889. #ifdef HAVE_CRYPT
  890.   char salt[3],*salt_ptr;
  891.   if ((null_value=args[0]->null_value))
  892.     return 0;
  893.   if (res->length() == 0)
  894.     return &empty_string;
  895.   if (arg_count == 1)
  896.   { // generate random salt
  897.     time_t timestamp=current_thd->query_start();
  898.     salt[0] = bin_to_ascii(timestamp & 0x3f);
  899.     salt[1] = bin_to_ascii((timestamp >> 5) & 0x3f);
  900.     salt[2] = 0;
  901.     salt_ptr=salt;
  902.   }
  903.   else
  904.   { // obtain salt from the first two bytes
  905.     String *salt_str=args[1]->val_str(&tmp_value);
  906.     if ((null_value= (args[1]->null_value || salt_str->length() < 2)))
  907.       return 0;
  908.     salt_ptr= salt_str->c_ptr();
  909.   }
  910.   pthread_mutex_lock(&LOCK_crypt);
  911.   char *tmp=crypt(res->c_ptr(),salt_ptr);
  912.   str->set(tmp,(uint) strlen(tmp));
  913.   str->copy();
  914.   pthread_mutex_unlock(&LOCK_crypt);
  915.   return str;
  916. #else
  917.   null_value=1;
  918.   return 0;
  919. #endif /* HAVE_CRYPT */
  920. }
  921. void Item_func_encode::fix_length_and_dec()
  922. {
  923.   max_length=args[0]->max_length;
  924.   maybe_null=args[0]->maybe_null;
  925. }
  926. String *Item_func_encode::val_str(String *str)
  927. {
  928.   String *res;
  929.   if (!(res=args[0]->val_str(str)))
  930.   {
  931.     null_value=1; /* purecov: inspected */
  932.     return 0; /* purecov: inspected */
  933.   }
  934.   null_value=0;
  935.   res=copy_if_not_alloced(str,res,res->length());
  936.   sql_crypt.init();
  937.   sql_crypt.encode((char*) res->ptr(),res->length());
  938.   return res;
  939. }
  940. String *Item_func_decode::val_str(String *str)
  941. {
  942.   String *res;
  943.   if (!(res=args[0]->val_str(str)))
  944.   {
  945.     null_value=1; /* purecov: inspected */
  946.     return 0; /* purecov: inspected */
  947.   }
  948.   null_value=0;
  949.   res=copy_if_not_alloced(str,res,res->length());
  950.   sql_crypt.init();
  951.   sql_crypt.decode((char*) res->ptr(),res->length());
  952.   return res;
  953. }
  954. String *Item_func_database::val_str(String *str)
  955. {
  956.   if (!current_thd->db)
  957.     str->length(0);
  958.   else
  959.     str->set((const char*) current_thd->db,(uint) strlen(current_thd->db));
  960.   return str;
  961. }
  962. String *Item_func_user::val_str(String *str)
  963. {
  964.   THD *thd=current_thd;
  965.   if (str->copy((const char*) thd->user,(uint) strlen(thd->user)) ||
  966.       str->append('@') ||
  967.       str->append(thd->host ? thd->host : thd->ip ? thd->ip : ""))
  968.     return &empty_string;
  969.   return str;
  970. }
  971. void Item_func_soundex::fix_length_and_dec()
  972. {
  973.   max_length=args[0]->max_length;
  974.   set_if_bigger(max_length,4);
  975. }
  976.   /*
  977.     If alpha, map input letter to soundex code.
  978.     If not alpha and remove_garbage is set then skipp to next char
  979.     else return 0
  980.     */
  981. extern "C" {
  982. extern char *soundex_map; // In mysys/static.c
  983. }
  984. static char get_scode(char *ptr)
  985. {
  986.   uchar ch=toupper(*ptr);
  987.   if (ch < 'A' || ch > 'Z')
  988.   {
  989. // Thread extended alfa (country spec)
  990.     return '0'; // as vokal
  991.   }
  992.   return(soundex_map[ch-'A']);
  993. }
  994. String *Item_func_soundex::val_str(String *str)
  995. {
  996.   String *res  =args[0]->val_str(str);
  997.   char last_ch,ch;
  998.   if ((null_value=args[0]->null_value))
  999.     return 0; /* purecov: inspected */
  1000.   if (str_value.alloc(max(res->length(),4)))
  1001.     return str; /* purecov: inspected */
  1002.   char *to= (char *) str_value.ptr();
  1003.   char *from= (char *) res->ptr(), *end=from+res->length();
  1004.   while (from != end && isspace(*from)) // Skipp pre-space
  1005.     from++; /* purecov: inspected */
  1006.   if (from == end)
  1007.     return &empty_string; // No alpha characters.
  1008.   *to++ = toupper(*from); // Copy first letter
  1009.   last_ch = get_scode(from); // code of the first letter
  1010. // for the first 'double-letter check.
  1011. // Loop on input letters until
  1012. // end of input (null) or output
  1013. // letter code count = 3
  1014.   for (from++ ; from < end ; from++)
  1015.   {
  1016.     if (!isalpha(*from))
  1017.       continue;
  1018.     ch=get_scode(from);
  1019.     if ((ch != '0') && (ch != last_ch)) // if not skipped or double
  1020.     {
  1021.        *to++ = ch; // letter, copy to output
  1022.        last_ch = ch; // save code of last input letter
  1023.     } // for next double-letter check
  1024.   }
  1025.   for (end=(char*) str_value.ptr()+4 ; to < end ; to++)
  1026.     *to = '0';
  1027.   *to=0; // end string
  1028.   str_value.length((uint) (to-str_value.ptr()));
  1029.   return &str_value;
  1030. }
  1031. /*
  1032. ** Change a number to format '3,333,333,333.000'
  1033. ** This should be 'internationalized' sometimes.
  1034. */
  1035. Item_func_format::Item_func_format(Item *org,int dec) :Item_str_func(org)
  1036. {
  1037.   decimals=(uint) set_zone(dec,0,30);
  1038. }
  1039. String *Item_func_format::val_str(String *str)
  1040. {
  1041.   double nr =args[0]->val();
  1042.   uint32 diff,length,str_length;
  1043.   uint dec;
  1044.   if ((null_value=args[0]->null_value))
  1045.     return 0; /* purecov: inspected */
  1046.   dec= decimals ? decimals+1 : 0;
  1047.   str->set(nr,decimals);
  1048.   str_length=str->length();
  1049.   if (nr < 0)
  1050.     str_length--; // Don't count sign
  1051.   length=str->length()+(diff=(str_length- dec-1)/3);
  1052.   if (diff)
  1053.   {
  1054.     char *tmp,*pos;
  1055.     str=copy_if_not_alloced(&tmp_str,str,length);
  1056.     str->length(length);
  1057.     tmp=(char*) str->ptr()+length - dec-1;
  1058.     for (pos=(char*) str->ptr()+length ; pos != tmp; pos--)
  1059.       pos[0]=pos[- (int) diff];
  1060.     while (diff)
  1061.     {
  1062.       pos[0]=pos[-(int) diff]; pos--;
  1063.       pos[0]=pos[-(int) diff]; pos--;
  1064.       pos[0]=pos[-(int) diff]; pos--;
  1065.       pos[0]=',';
  1066.       pos--;
  1067.       diff--;
  1068.     }
  1069.   }
  1070.   return str;
  1071. }
  1072. void Item_func_elt::fix_length_and_dec()
  1073. {
  1074.   max_length=0;
  1075.   decimals=0;
  1076.   for (uint i=1 ; i < arg_count ; i++)
  1077.   {
  1078.     set_if_bigger(max_length,args[i]->max_length);
  1079.     set_if_bigger(decimals,args[i]->decimals);
  1080.   }
  1081.   maybe_null=1; // NULL if wrong first arg
  1082.   with_sum_func= with_sum_func || item->with_sum_func;
  1083.   used_tables_cache|=item->used_tables();
  1084.   const_item_cache&=item->const_item();
  1085. }
  1086. void Item_func_elt::update_used_tables()
  1087. {
  1088.   Item_func::update_used_tables();
  1089.   item->update_used_tables();
  1090.   used_tables_cache|=item->used_tables();
  1091.   const_item_cache&=item->const_item();
  1092. }
  1093. double Item_func_elt::val()
  1094. {
  1095.   uint tmp;
  1096.   if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
  1097.   {
  1098.     null_value=1;
  1099.     return 0.0;
  1100.   }
  1101.   null_value=0;
  1102.   return args[tmp-1]->val();
  1103. }
  1104. longlong Item_func_elt::val_int()
  1105. {
  1106.   uint tmp;
  1107.   if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
  1108.   {
  1109.     null_value=1;
  1110.     return 0;
  1111.   }
  1112.   null_value=0;
  1113.   return args[tmp-1]->val_int();
  1114. }
  1115. String *Item_func_elt::val_str(String *str)
  1116. {
  1117.   uint tmp;
  1118.   if ((tmp=(uint) item->val_int()) == 0 || tmp > arg_count)
  1119.   {
  1120.     null_value=1;
  1121.     return NULL;
  1122.   }
  1123.   null_value=0;
  1124.   return args[tmp-1]->val_str(str);
  1125. }
  1126. void Item_func_make_set::fix_length_and_dec()
  1127. {
  1128.   max_length=arg_count-1;
  1129.   for (uint i=1 ; i < arg_count ; i++)
  1130.     max_length+=args[i]->max_length;
  1131.   used_tables_cache|=item->used_tables();
  1132.   const_item_cache&=item->const_item();
  1133. }
  1134. void Item_func_make_set::update_used_tables()
  1135. {
  1136.   Item_func::update_used_tables();
  1137.   item->update_used_tables();
  1138.   used_tables_cache|=item->used_tables();
  1139.   const_item_cache&=item->const_item();
  1140. }
  1141. String *Item_func_make_set::val_str(String *str)
  1142. {
  1143.   ulonglong bits;
  1144.   bool first_found=0;
  1145.   Item **ptr=args;
  1146.   String *result=&empty_string;
  1147.   bits=item->val_int();
  1148.   if ((null_value=item->null_value))
  1149.     return NULL;
  1150.   if (arg_count < 64)
  1151.     bits &= ((ulonglong) 1 << arg_count)-1;
  1152.   for (; bits; bits >>= 1, ptr++)
  1153.   {
  1154.     if (bits & 1)
  1155.     {
  1156.       String *res= (*ptr)->val_str(str);
  1157.       if (res) // Skipp nulls
  1158.       {
  1159. if (!first_found)
  1160. { // First argument
  1161.   first_found=1;
  1162.   if (res != str)
  1163.     result=res; // Use original string
  1164.   else
  1165.   {
  1166.     if (tmp_str.copy(*res)) // Don't use 'str'
  1167.       return &empty_string;
  1168.     result= &tmp_str;
  1169.   }
  1170. }
  1171. else
  1172. {
  1173.   if (result != &tmp_str)
  1174.   { // Copy data to tmp_str
  1175.     if (tmp_str.alloc(result->length()+res->length()+1) ||
  1176. tmp_str.copy(*result))
  1177.       return &empty_string;
  1178.     result= &tmp_str;
  1179.   }
  1180.   if (tmp_str.append(',') || tmp_str.append(*res))
  1181.     return &empty_string;
  1182. }
  1183.       }
  1184.     }
  1185.   }
  1186.   return result;
  1187. }
  1188. String *Item_func_char::val_str(String *str)
  1189. {
  1190.   str->length(0);
  1191.   for (uint i=0 ; i < arg_count ; i++)
  1192.   {
  1193.     int32 num=(int32) args[i]->val_int();
  1194.     if (!args[i]->null_value)
  1195. #ifdef USE_MB
  1196.       if (use_mb(default_charset_info))
  1197.       {
  1198.         if (num&0xFF000000L) {
  1199.            str->append((char)(num>>24));
  1200.            goto b2;
  1201.         } else if (num&0xFF0000L) {
  1202. b2:        str->append((char)(num>>16));
  1203.            goto b1;
  1204.         } else if (num&0xFF00L) {   
  1205. b1:        str->append((char)(num>>8));
  1206.         }
  1207.       }
  1208. #endif
  1209.       str->append((char)num);
  1210.   }
  1211.   str->realloc(str->length()); // Add end 0 (for Purify)
  1212.   return str;
  1213. }
  1214. inline String* alloc_buffer(String *res,String *str,String *tmp_value,
  1215.     ulong length)
  1216. {
  1217.   if (res->alloced_length() < length)
  1218.   {
  1219.     if (str->alloced_length() >= length)
  1220.     {
  1221.       (void) str->copy(*res);
  1222.       str->length(length);
  1223.       return str;
  1224.     }
  1225.     else
  1226.     {
  1227.       if (tmp_value->alloc(length))
  1228. return 0;
  1229.       (void) tmp_value->copy(*res);
  1230.       tmp_value->length(length);
  1231.       return tmp_value;
  1232.     }
  1233.   }
  1234.   res->length(length);
  1235.   return res;
  1236. }
  1237. void Item_func_repeat::fix_length_and_dec()
  1238. {
  1239.   if (args[1]->const_item())
  1240.   {
  1241.     max_length=(long) (args[0]->max_length * args[1]->val_int());
  1242.     if (max_length >= MAX_BLOB_WIDTH)
  1243.     {
  1244.       max_length=MAX_BLOB_WIDTH;
  1245.       maybe_null=1;
  1246.     }
  1247.   }
  1248.   else
  1249.   {
  1250.     max_length=MAX_BLOB_WIDTH;
  1251.     maybe_null=1;
  1252.   }
  1253. }
  1254. /*
  1255. ** Item_func_repeat::str is carefully written to avoid reallocs
  1256. ** as much as possible at the cost of a local buffer
  1257. */
  1258. String *Item_func_repeat::val_str(String *str)
  1259. {
  1260.   uint length,tot_length;
  1261.   char *to;
  1262.   long count= (long) args[1]->val_int();
  1263.   String *res =args[0]->val_str(str);
  1264.   if (args[0]->null_value || args[1]->null_value)
  1265.     goto err; // string and/or delim are null
  1266.   null_value=0;
  1267.   if (count <= 0) // For nicer SQL code
  1268.     return &empty_string;
  1269.   if (count == 1) // To avoid reallocs
  1270.     return res;
  1271.   length=res->length();
  1272.   if (length > max_allowed_packet/count)// Safe length check
  1273.     goto err; // Probably an error
  1274.   tot_length= length*(uint) count;
  1275.   if (!(res= alloc_buffer(res,str,&tmp_value,tot_length)))
  1276.     goto err;
  1277.   to=(char*) res->ptr()+length;
  1278.   while (--count)
  1279.   {
  1280.     memcpy(to,res->ptr(),length);
  1281.     to+=length;
  1282.   }
  1283.   return (res);
  1284. err:
  1285.   null_value=1;
  1286.   return 0;
  1287. }
  1288. void Item_func_rpad::fix_length_and_dec()
  1289. {
  1290.   if (args[1]->const_item())
  1291.   {
  1292.     uint32 length= (uint32) args[1]->val_int();
  1293.     max_length=max(args[0]->max_length,length);
  1294.     if (max_length >= MAX_BLOB_WIDTH)
  1295.     {
  1296.       max_length=MAX_BLOB_WIDTH;
  1297.       maybe_null=1;
  1298.     }
  1299.   }
  1300.   else
  1301.   {
  1302.     max_length=MAX_BLOB_WIDTH;
  1303.     maybe_null=1;
  1304.   }
  1305. }
  1306. String *Item_func_rpad::val_str(String *str)
  1307. {
  1308.   uint32 res_length,length_pad;
  1309.   char *to;
  1310.   const char *ptr_pad;
  1311.   int32 count= (int32) args[1]->val_int();
  1312.   String *res =args[0]->val_str(str);
  1313.   String *rpad = args[2]->val_str(str);
  1314.   if (!res || args[1]->null_value || !rpad)
  1315.     goto err;
  1316.   null_value=0;
  1317.   if (count <= (int32) (res_length=res->length()))
  1318.   { // String to pad is big enough
  1319.     res->length(count); // Shorten result if longer
  1320.     return (res);
  1321.   }
  1322.   length_pad= rpad->length();
  1323.   if ((ulong) count > max_allowed_packet || args[2]->null_value || !length_pad)
  1324.     goto err;
  1325.   if (!(res= alloc_buffer(res,str,&tmp_value,count)))
  1326.     goto err;
  1327.   to= (char*) res->ptr()+res_length;
  1328.   ptr_pad=rpad->ptr();
  1329.   for (count-= res_length; (uint32) count > length_pad; count-= length_pad)
  1330.   {
  1331.     memcpy(to,ptr_pad,length_pad);
  1332.     to+= length_pad;
  1333.   }
  1334.   memcpy(to,ptr_pad,(size_t) count);
  1335.   return (res);
  1336.  err:
  1337.   null_value=1;
  1338.   return 0;
  1339. }
  1340. void Item_func_lpad::fix_length_and_dec()
  1341. {
  1342.   if (args[1]->const_item())
  1343.   {
  1344.     uint32 length= (uint32) args[1]->val_int();
  1345.     max_length=max(args[0]->max_length,length);
  1346.     if (max_length >= MAX_BLOB_WIDTH)
  1347.     {
  1348.       max_length=MAX_BLOB_WIDTH;
  1349.       maybe_null=1;
  1350.     }
  1351.   }
  1352.   else
  1353.   {
  1354.     max_length=MAX_BLOB_WIDTH;
  1355.     maybe_null=1;
  1356.   }
  1357. }
  1358. String *Item_func_lpad::val_str(String *str)
  1359. {
  1360.   uint32 res_length,length_pad;
  1361.   char *to;
  1362.   const char *ptr_pad;
  1363.   ulong count= (long) args[1]->val_int();
  1364.   String *res= args[0]->val_str(str);
  1365.   String *lpad= args[2]->val_str(str);
  1366.   if (!res || args[1]->null_value || !lpad)
  1367.     goto err;
  1368.   null_value=0;
  1369.   if (count <= (res_length=res->length()))
  1370.   { // String to pad is big enough
  1371.     res->length(count); // Shorten result if longer
  1372.     return (res);
  1373.   }
  1374.   length_pad= lpad->length();
  1375.   if (count > max_allowed_packet || args[2]->null_value || !length_pad)
  1376.     goto err;
  1377.   if (res->alloced_length() < count)
  1378.   {
  1379.     if (str->alloced_length() >= count)
  1380.     {
  1381.       memcpy((char*) str->ptr()+(count-res_length),res->ptr(),res_length);
  1382.       res=str;
  1383.     }
  1384.     else
  1385.     {
  1386.       if (tmp_value.alloc(count))
  1387. goto err;
  1388.       memcpy((char*) tmp_value.ptr()+(count-res_length),res->ptr(),res_length);
  1389.       res=&tmp_value;
  1390.     }
  1391.   }
  1392.   else
  1393.     bmove_upp((char*) res->ptr()+count,res->ptr()+res_length,res_length);
  1394.   res->length(count);
  1395.   to= (char*) res->ptr();
  1396.   ptr_pad= lpad->ptr();
  1397.   for (count-= res_length; count > length_pad; count-= length_pad)
  1398.   {
  1399.     memcpy(to,ptr_pad,length_pad);
  1400.     to+= length_pad;
  1401.   }
  1402.   memcpy(to,ptr_pad,(size_t) count);
  1403.   return (res);
  1404.  err:
  1405.   null_value=1;
  1406.   return 0;
  1407. }
  1408. String *Item_func_conv::val_str(String *str)
  1409. {
  1410.   String *res= args[0]->val_str(str);
  1411.   char *endptr,ans[65],*ptr;
  1412.   longlong dec;
  1413.   int from_base= (int) args[1]->val_int();
  1414.   int to_base= (int) args[2]->val_int();
  1415.   if (args[0]->null_value || args[1]->null_value || args[2]->null_value ||
  1416.       abs(to_base) > 36 || abs(to_base) < 2 ||
  1417.       abs(from_base) > 36 || abs(from_base) < 2 || !(res->length()))
  1418.   {
  1419.     null_value=1;
  1420.     return 0;
  1421.   }
  1422.   null_value=0;
  1423.   if (from_base < 0)
  1424.     dec= strtoll(res->c_ptr(),&endptr,-from_base);
  1425.   else
  1426.     dec= (longlong) strtoull(res->c_ptr(),&endptr,from_base);
  1427.   ptr= longlong2str(dec,ans,to_base);
  1428.   if (str->copy(ans,(uint32) (ptr-ans)))
  1429.     return &empty_string;
  1430.   return str;
  1431. }
  1432. #include <my_dir.h> // For my_stat
  1433. String *Item_load_file::val_str(String *str)
  1434. {
  1435.   String *file_name;
  1436.   File file;
  1437.   MY_STAT stat_info;
  1438.   DBUG_ENTER("load_file");
  1439.   if (!(file_name= args[0]->val_str(str)) ||
  1440.       !(current_thd->master_access & FILE_ACL) ||
  1441.       !my_stat(file_name->c_ptr(), &stat_info, MYF(MY_WME)))
  1442.     goto err;
  1443.   if (!(stat_info.st_mode & S_IROTH))
  1444.   {
  1445.     /* my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr()); */
  1446.     goto err;
  1447.   }
  1448.   if (stat_info.st_size > (long) max_allowed_packet)
  1449.   {
  1450.     /* my_error(ER_TOO_LONG_STRING, MYF(0), file_name->c_ptr()); */
  1451.     goto err;
  1452.   }
  1453.   if (tmp_value.alloc(stat_info.st_size))
  1454.     goto err;
  1455.   if ((file = my_open(file_name->c_ptr(), O_RDONLY, MYF(0))) < 0)
  1456.     goto err;
  1457.   if (my_read(file, (byte*) tmp_value.ptr(), stat_info.st_size, MYF(MY_NABP)))
  1458.   {
  1459.     my_close(file, MYF(0));
  1460.     goto err;
  1461.   }
  1462.   tmp_value.length(stat_info.st_size);
  1463.   my_close(file, MYF(0));
  1464.   null_value = 0;
  1465.   return &tmp_value;
  1466. err:
  1467.   null_value = 1;
  1468.   DBUG_RETURN(0);
  1469. }
  1470. String* Item_func_export_set::val_str(String* str)
  1471. {
  1472.   ulonglong the_set = (ulonglong) args[0]->val_int();
  1473.   String yes_buf, *yes; 
  1474.   yes = args[1]->val_str(&yes_buf);
  1475.   String no_buf, *no; 
  1476.   no = args[2]->val_str(&no_buf);
  1477.   String *sep = NULL, sep_buf ; 
  1478.   uint num_set_values = 64;
  1479.   ulonglong mask = 0x1;
  1480.   str->length(0);
  1481.   /* Check if some argument is a NULL value */
  1482.   if (args[0]->null_value || args[1]->null_value || args[2]->null_value)
  1483.   {
  1484.     null_value=1;
  1485.     return 0;
  1486.   }
  1487.   switch(arg_count) {
  1488.   case 5:
  1489.     num_set_values = (uint) args[4]->val_int();
  1490.     if (num_set_values > 64)
  1491.       num_set_values=64;
  1492.     if (args[4]->null_value)
  1493.     {
  1494.       null_value=1;
  1495.       return 0;
  1496.     }
  1497.     /* Fall through */
  1498.   case 4:
  1499.     if (!(sep = args[3]->val_str(&sep_buf))) // Only true if NULL
  1500.     {
  1501.       null_value=1;
  1502.       return 0;
  1503.     }
  1504.     break;
  1505.   case 3:
  1506.     sep_buf.set(",", 1);
  1507.     sep = &sep_buf;
  1508.   }
  1509.   null_value=0;
  1510.   for (uint i = 0; i < num_set_values; i++, mask = (mask << 1))
  1511.   {
  1512.     if (the_set & mask)
  1513.       str->append(*yes);
  1514.     else
  1515.       str->append(*no);
  1516.     if(i != num_set_values - 1)
  1517.       str->append(*sep);
  1518.   }
  1519.   return str;
  1520. }
  1521. void Item_func_export_set::fix_length_and_dec()
  1522. {
  1523.   uint length=max(args[1]->max_length,args[2]->max_length);
  1524.   uint sep_length=(arg_count > 3 ? args[3]->max_length : 1);
  1525.   max_length=length*64+sep_length*63;
  1526. }
  1527. String* Item_func_inet_ntoa::val_str(String* str)
  1528. {
  1529.   uchar buf[8], *p;
  1530.   ulonglong n = (ulonglong) args[0]->val_int();
  1531.   char num[4];
  1532.   // we do not know if args[0] is NULL until we have called
  1533.   // some val function on it if args[0] is not a constant!
  1534.   if ((null_value=args[0]->null_value))
  1535.     return 0; // Null value
  1536.   str->length(0);
  1537.   int8store(buf,n);
  1538.   // now we can assume little endian
  1539.   // we handle the possibility of an 8-byte IP address
  1540.   // however, we do not want to confuse those who are just using
  1541.   // 4 byte ones
  1542.   
  1543.   for (p= buf + 8; p > buf+4 && p[-1] == 0 ; p-- ) ;
  1544.   num[3]='.';
  1545.   while (p-- > buf)
  1546.   {
  1547.     uint c = *p;
  1548.     uint n1,n2; // Try to avoid divisions
  1549.     n1= c / 100; // 100 digits
  1550.     c-= n1*100;
  1551.     n2= c / 10; // 10 digits
  1552.     c-=n2*10; // last digit
  1553.     num[0]=(char) n1+'0';
  1554.     num[1]=(char) n2+'0';
  1555.     num[2]=(char) c+'0';
  1556.     uint length=(n1 ? 4 : n2 ? 3 : 2); // Remove pre-zero
  1557.     (void) str->append(num+4-length,length);
  1558.   }
  1559.   str->length(str->length()-1); // Remove last '.';
  1560.   return str;
  1561. }