home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / item_strfunc.h < prev    next >
C/C++ Source or Header  |  2000-11-16  |  12KB  |  436 lines

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