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

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. #ifdef __GNUC__
  18. #pragma interface /* gcc class implementation */
  19. #endif
  20. class Item_str_func :public Item_func
  21. {
  22. public:
  23.   Item_str_func() :Item_func() { decimals=NOT_FIXED_DEC; }
  24.   Item_str_func(Item *a) :Item_func(a) {decimals=NOT_FIXED_DEC; }
  25.   Item_str_func(Item *a,Item *b) :Item_func(a,b) { decimals=NOT_FIXED_DEC; }
  26.   Item_str_func(Item *a,Item *b,Item *c) :Item_func(a,b,c) { decimals=NOT_FIXED_DEC; }
  27.   Item_str_func(Item *a,Item *b,Item *c,Item *d) :Item_func(a,b,c,d) {decimals=NOT_FIXED_DEC; }
  28.   Item_str_func(Item *a,Item *b,Item *c,Item *d, Item* e) :Item_func(a,b,c,d,e) {decimals=NOT_FIXED_DEC; }
  29.   Item_str_func(List<Item> &list) :Item_func(list) {decimals=NOT_FIXED_DEC; }
  30.   longlong val_int();
  31.   double val();
  32.   enum Item_result result_type () const { return STRING_RESULT; }
  33.   void left_right_max_length();
  34. };
  35. class Item_func_md5 :public Item_str_func
  36. {
  37.   String tmp_value;
  38. public:
  39.   Item_func_md5(Item *a) :Item_str_func(a) {}
  40.   String *val_str(String *);
  41.   void fix_length_and_dec();
  42.   const char *func_name() const { return "md5"; }
  43. };
  44. class Item_func_concat :public Item_str_func
  45. {
  46.   String tmp_value;
  47. public:
  48.   Item_func_concat(List<Item> &list) :Item_str_func(list) {}
  49.   Item_func_concat(Item *a,Item *b) :Item_str_func(a,b) {}
  50.   String *val_str(String *);
  51.   void fix_length_and_dec();
  52.   const char *func_name() const { return "concat"; }
  53. };
  54. class Item_func_concat_ws :public Item_str_func
  55. {
  56.   Item *separator;
  57.   String tmp_value;
  58. public:
  59.   Item_func_concat_ws(Item *a,List<Item> &list) 
  60.     :Item_str_func(list),separator(a) {}
  61.   ~Item_func_concat_ws() { delete separator; }
  62.   String *val_str(String *);
  63.   void fix_length_and_dec();
  64.   void update_used_tables();
  65.   bool fix_fields(THD *thd,struct st_table_list *tlist)
  66.   {
  67.     return (separator->fix_fields(thd,tlist)
  68.     || Item_func::fix_fields(thd,tlist));
  69.   }
  70.  const char *func_name() const { return "concat_ws"; }
  71. };
  72. class Item_func_reverse :public Item_str_func
  73. {
  74. public:
  75.   Item_func_reverse(Item *a) :Item_str_func(a) {}
  76.   String *val_str(String *);
  77.   void fix_length_and_dec();
  78. };
  79. class Item_func_replace :public Item_str_func
  80. {
  81.   String tmp_value,tmp_value2;
  82. public:
  83.   Item_func_replace(Item *org,Item *find,Item *replace)
  84.     :Item_str_func(org,find,replace) {}
  85.   String *val_str(String *);
  86.   void fix_length_and_dec();
  87.   const char *func_name() const { return "replace"; }
  88. };
  89. class Item_func_insert :public Item_str_func
  90. {
  91.   String tmp_value;
  92. public:
  93.   Item_func_insert(Item *org,Item *start,Item *length,Item *new_str)
  94.     :Item_str_func(org,start,length,new_str) {}
  95.   String *val_str(String *);
  96.   void fix_length_and_dec();
  97.   const char *func_name() const { return "insert"; }
  98. };
  99. class Item_str_conv :public Item_str_func
  100. {
  101. public:
  102.   Item_str_conv(Item *item) :Item_str_func(item) {}
  103.   void fix_length_and_dec() { max_length = args[0]->max_length; }
  104. };
  105. class Item_func_lcase :public Item_str_conv
  106. {
  107. public:
  108.   Item_func_lcase(Item *item) :Item_str_conv(item) {}
  109.   String *val_str(String *);
  110.   const char *func_name() const { return "lcase"; }
  111. };
  112. class Item_func_ucase :public Item_str_conv
  113. {
  114. public:
  115.   Item_func_ucase(Item *item) :Item_str_conv(item) {}
  116.   String *val_str(String *);
  117.   const char *func_name() const { return "ucase"; }
  118. };
  119. class Item_func_left :public Item_str_func
  120. {
  121. public:
  122.   Item_func_left(Item *a,Item *b) :Item_str_func(a,b) {}
  123.   String *val_str(String *);
  124.   void fix_length_and_dec();
  125.   const char *func_name() const { return "left"; }
  126. };
  127. class Item_func_right :public Item_str_func
  128. {
  129.   String tmp_value;
  130. public:
  131.   Item_func_right(Item *a,Item *b) :Item_str_func(a,b) {}
  132.   String *val_str(String *);
  133.   void fix_length_and_dec();
  134.   const char *func_name() const { return "right"; }
  135. };
  136. class Item_func_substr :public Item_str_func
  137. {
  138.   String tmp_value;
  139. public:
  140.   Item_func_substr(Item *a,Item *b) :Item_str_func(a,b) {}
  141.   Item_func_substr(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  142.   String *val_str(String *);
  143.   void fix_length_and_dec();
  144.   const char *func_name() const { return "substr"; }
  145. };
  146. class Item_func_substr_index :public Item_str_func
  147. {
  148.   String tmp_value;
  149. public:
  150.   Item_func_substr_index(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  151.   String *val_str(String *);
  152.   void fix_length_and_dec() { max_length= args[0]->max_length; }
  153.   const char *func_name() const { return "substr_index"; }
  154. };
  155. class Item_func_ltrim :public Item_str_func
  156. {
  157.   String tmp_value;
  158. public:
  159.   Item_func_ltrim(Item *a,Item *b) :Item_str_func(a,b) {}
  160.   String *val_str(String *);
  161.   void fix_length_and_dec() { max_length= args[0]->max_length; }
  162.   const char *func_name() const { return "ltrim"; }
  163. };
  164. class Item_func_rtrim :public Item_str_func
  165. {
  166.   String tmp_value;
  167. public:
  168.   Item_func_rtrim(Item *a,Item *b) :Item_str_func(a,b) {}
  169.   String *val_str(String *);
  170.   void fix_length_and_dec() { max_length= args[0]->max_length; }
  171.   const char *func_name() const { return "rtrim"; }
  172. };
  173. class Item_func_trim :public Item_str_func
  174. {
  175.   String tmp_value;
  176. public:
  177.   Item_func_trim(Item *a,Item *b) :Item_str_func(a,b) {}
  178.   String *val_str(String *);
  179.   void fix_length_and_dec() { max_length= args[0]->max_length; }
  180.   const char *func_name() const { return "trim"; }
  181. };
  182. class Item_func_password :public Item_str_func
  183. {
  184.   char tmp_value[17];
  185. public:
  186.   Item_func_password(Item *a) :Item_str_func(a) {}
  187.   String *val_str(String *);
  188.   void fix_length_and_dec() { max_length = 16; }
  189.   const char *func_name() const { return "password"; }
  190. };
  191. class Item_func_encrypt :public Item_str_func
  192. {
  193.   String tmp_value;
  194. public:
  195.   Item_func_encrypt(Item *a) :Item_str_func(a) {}
  196.   Item_func_encrypt(Item *a, Item *b): Item_str_func(a,b) {}
  197.   String *val_str(String *);
  198.   void fix_length_and_dec() { maybe_null=1; max_length = 13; }
  199. };
  200. #include "sql_crypt.h"
  201. class Item_func_encode :public Item_str_func
  202. {
  203.  protected:
  204.   SQL_CRYPT sql_crypt;
  205. public:
  206.   Item_func_encode(Item *a, char *seed):
  207.     Item_str_func(a),sql_crypt(seed) {}
  208.   String *val_str(String *);
  209.   void fix_length_and_dec();
  210. };
  211. class Item_func_decode :public Item_func_encode
  212. {
  213. public:
  214.   Item_func_decode(Item *a, char *seed): Item_func_encode(a,seed) {}
  215.   String *val_str(String *);
  216. };
  217. class Item_func_database :public Item_str_func
  218. {
  219. public:
  220.   Item_func_database() {}
  221.   String *val_str(String *);
  222.   void fix_length_and_dec() { max_length= MAX_FIELD_NAME; }
  223.   const char *func_name() const { return "database"; }
  224. };
  225. class Item_func_user :public Item_str_func
  226. {
  227. public:
  228.   Item_func_user() {}
  229.   String *val_str(String *);
  230.   void fix_length_and_dec() { max_length= USERNAME_LENGTH+HOSTNAME_LENGTH+1; }
  231.   const char *func_name() const { return "user"; }
  232. };
  233. class Item_func_soundex :public Item_str_func
  234. {
  235. public:
  236.   Item_func_soundex(Item *a) :Item_str_func(a) {}
  237.   String *val_str(String *);
  238.   void fix_length_and_dec();
  239.   const char *func_name() const { return "soundex"; }
  240. };
  241. class Item_func_elt :public Item_str_func
  242. {
  243.   Item *item;
  244. public:
  245.   Item_func_elt(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
  246.   ~Item_func_elt() { delete item; }
  247.   double val();
  248.   longlong val_int();
  249.   String *val_str(String *str);
  250.   bool fix_fields(THD *thd,struct st_table_list *tlist)
  251.   {
  252.     return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist));
  253.   }
  254.   void fix_length_and_dec();
  255.   void update_used_tables();
  256.   const char *func_name() const { return "elt"; }
  257. };
  258. class Item_func_make_set :public Item_str_func
  259. {
  260.   Item *item;
  261.   String tmp_str;
  262. public:
  263.   Item_func_make_set(Item *a,List<Item> &list) :Item_str_func(list),item(a) {}
  264.   ~Item_func_make_set() { delete item; }
  265.   String *val_str(String *str);
  266.   bool fix_fields(THD *thd,struct st_table_list *tlist)
  267.   {
  268.     return (item->fix_fields(thd,tlist) || Item_func::fix_fields(thd,tlist));
  269.   }
  270.   void fix_length_and_dec();
  271.   void update_used_tables();
  272.   const char *func_name() const { return "make_set"; }
  273. };
  274. class Item_func_format :public Item_str_func
  275. {
  276.   String tmp_str;
  277. public:
  278.   Item_func_format(Item *org,int dec);
  279.   String *val_str(String *);
  280.   void fix_length_and_dec()
  281.   {
  282.     max_length=args[0]->max_length+(args[0]->max_length-args[0]->decimals)/3;
  283.   }
  284.   const char *func_name() const { return "format"; }
  285. };
  286. class Item_func_char :public Item_str_func
  287. {
  288. public:
  289.   Item_func_char(List<Item> &list) :Item_str_func(list) {}
  290.   String *val_str(String *);
  291.   void fix_length_and_dec() { maybe_null=0; max_length=arg_count; binary=0;}
  292.   const char *func_name() const { return "char"; }
  293. };
  294. class Item_func_repeat :public Item_str_func
  295. {
  296.   String tmp_value;
  297. public:
  298.   Item_func_repeat(Item *arg1,Item *arg2) :Item_str_func(arg1,arg2) {}
  299.   String *val_str(String *);
  300.   void fix_length_and_dec();
  301.   const char *func_name() const { return "repeat"; }
  302. };
  303. class Item_func_rpad :public Item_str_func
  304. {
  305.   String tmp_value;
  306. public:
  307.   Item_func_rpad(Item *arg1,Item *arg2,Item *arg3)
  308.     :Item_str_func(arg1,arg2,arg3) {}
  309.   String *val_str(String *);
  310.   void fix_length_and_dec();
  311.   const char *func_name() const { return "rpad"; }
  312. };
  313. class Item_func_lpad :public Item_str_func
  314. {
  315.   String tmp_value;
  316. public:
  317.   Item_func_lpad(Item *arg1,Item *arg2,Item *arg3)
  318.     :Item_str_func(arg1,arg2,arg3) {}
  319.   String *val_str(String *);
  320.   void fix_length_and_dec();
  321.   const char *func_name() const { return "lpad"; }
  322. };
  323. class Item_func_conv :public Item_str_func
  324. {
  325. public:
  326.   Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
  327.   const char *func_name() const { return "conv"; }
  328.   String *val_str(String *);
  329.   void fix_length_and_dec() { decimals=0; max_length=64; }
  330. };
  331. class Item_func_binary :public Item_str_func
  332. {
  333. public:
  334.   Item_func_binary(Item *a) :Item_str_func(a) {}
  335.   const char *func_name() const { return "binary"; }
  336.   String *val_str(String *a) { return (args[0]->val_str(a)); }
  337.   void fix_length_and_dec() { binary=1; max_length=args[0]->max_length; }
  338.   void print(String *str) { print_op(str); }
  339. };
  340. class Item_load_file :public Item_str_func
  341. {
  342.   String tmp_value;
  343. public:
  344.   Item_load_file(Item *a) :Item_str_func(a) {}
  345.   String *val_str(String *);
  346.   const char *func_name() const { return "load_file"; }
  347.   void fix_length_and_dec()
  348.   { binary=1; maybe_null=1; max_length=MAX_BLOB_WIDTH;}
  349. };
  350. class Item_func_export_set: public Item_str_func
  351. {
  352.  public:
  353.   Item_func_export_set(Item *a,Item *b,Item* c) :Item_str_func(a,b,c) {}
  354.   Item_func_export_set(Item *a,Item *b,Item* c,Item* d) :Item_str_func(a,b,c,d) {}
  355.   Item_func_export_set(Item *a,Item *b,Item* c,Item* d,Item* e) :Item_str_func(a,b,c,d,e) {}
  356.   String  *val_str(String *str);
  357.   void fix_length_and_dec();
  358.   const char *func_name() const { return "export_set"; }
  359. };
  360.  class Item_func_inet_ntoa : public Item_str_func
  361. {
  362. public:
  363.   Item_func_inet_ntoa(Item *a) :Item_str_func(a)
  364.     {
  365.     }
  366.   String* val_str(String* str);
  367.   const char *func_name() const { return "inet_ntoa"; }
  368.   void fix_length_and_dec() { decimals = 0; max_length=3*8+7; }
  369. };