item.h 18 KB
Newer Older
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
2

bk@work.mysql.com's avatar
bk@work.mysql.com 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.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
7

bk@work.mysql.com's avatar
bk@work.mysql.com 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.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
12

bk@work.mysql.com's avatar
bk@work.mysql.com committed
13 14 15 16 17 18 19 20 21 22 23 24 25
   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 */


#ifdef __GNUC__
#pragma interface			/* gcc class implementation */
#endif

struct st_table_list;
void item_init(void);				/* Init item functions */

class Item {
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
26
  Item(const Item &);				/* Prevent use of these */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
27 28
  void operator=(Item &);
public:
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
29
  static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
30 31 32 33
  static void operator delete(void *ptr,size_t size) {} /*lint -e715 */

  enum Type {FIELD_ITEM,FUNC_ITEM,SUM_FUNC_ITEM,STRING_ITEM,
	     INT_ITEM,REAL_ITEM,NULL_ITEM,VARBIN_ITEM,
34
	     COPY_STR_ITEM,FIELD_AVG_ITEM, DEFAULT_ITEM,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
35 36 37 38 39 40 41 42 43 44 45
	     PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM, CONST_ITEM};
  enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE };

  String str_value;			/* used to store value */
  my_string name;			/* Name from select */
  Item *next;
  uint32 max_length;
  uint8 marker,decimals;
  my_bool maybe_null;			/* If item may be null */
  my_bool null_value;			/* if item is null */
  my_bool binary;
46
  my_bool unsigned_flag;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
47 48 49 50 51 52 53 54 55
  my_bool with_sum_func;


  // alloc & destruct is done as start of select using sql_alloc
  Item();
  virtual ~Item() { name=0; }		/*lint -e1509 */
  void set_name(char* str,uint length=0);
  void init_make_field(Send_field *tmp_field,enum enum_field_types type);
  virtual bool fix_fields(THD *,struct st_table_list *);
56
  virtual bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
57
  virtual void save_org_in_field(Field *field)
58
  { (void) save_in_field(field, 1); }
59
  virtual bool save_safe_in_field(Field *field)
60
  { return save_in_field(field, 1); }
61
  virtual bool send(THD *thd, String *str);
62
  virtual bool eq(const Item *, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
63 64 65 66 67 68
  virtual Item_result result_type () const { return REAL_RESULT; }
  virtual enum Type type() const =0;
  virtual double val()=0;
  virtual longlong val_int()=0;
  virtual String *val_str(String*)=0;
  virtual void make_field(Send_field *field)=0;
69
  virtual Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return 0; }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
70 71 72 73
  virtual const char *full_name() const { return name ? name : "???"; }
  virtual double  val_result() { return val(); }
  virtual longlong val_int_result() { return val_int(); }
  virtual String *str_result(String* tmp) { return val_str(tmp); }
74
  /* bit map of tables used by item */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
75
  virtual table_map used_tables() const { return (table_map) 0L; }
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
  /*
    Return table map of tables that can't be NULL tables (tables that are
    used in a context where if they would contain a NULL row generated
    by a LEFT or RIGHT join, the item would not be true).
    This expression is used on WHERE item to determinate if a LEFT JOIN can be
    converted to a normal join.
    Generally this function should return used_tables() if the function
    would return null if any of the arguments are null
    As this is only used in the beginning of optimization, the value don't
    have to be updated in update_used_tables()
  */
  virtual table_map not_null_tables() const { return used_tables(); }
  /*
    Returns true if this is a simple constant item like an integer, not
    a constant expression
  */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
92 93 94 95 96 97 98 99 100 101 102
  virtual bool basic_const_item() const { return 0; }
  virtual Item *new_item() { return 0; }	/* Only for const items */
  virtual cond_result eq_cmp_result() const { return COND_OK; }
  inline uint float_length(uint decimals_par) const
  { return decimals != NOT_FIXED_DEC ? (DBL_DIG+2+decimals_par) : DBL_DIG+8;}
  virtual bool const_item() const { return used_tables() == 0; }
  virtual void print(String *str_arg) { str_arg->append(full_name()); }
  virtual void update_used_tables() {}
  virtual void split_sum_func(List<Item> &fields) {}
  virtual bool get_date(TIME *ltime,bool fuzzydate);
  virtual bool get_time(TIME *ltime);
103 104
  virtual bool get_date_result(TIME *ltime,bool fuzzydate)
  { return get_date(ltime,fuzzydate); }
105
  virtual bool is_null() { return 0; }
106
  virtual unsigned int size_of()= 0;
107
  virtual void top_level_item() {}
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
108 109 110
  virtual void set_result_field(Field *field) {}
  virtual bool is_result_field() { return 0; }
  virtual void save_in_result_field(bool no_conversions) {}
111
  virtual void no_rows_in_result() {}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125
};


class Item_ident :public Item
{
public:
  const char *db_name;
  const char *table_name;
  const char *field_name;
  Item_ident(const char *db_name_par,const char *table_name_par,
	     const char *field_name_par)
    :db_name(db_name_par),table_name(table_name_par),field_name(field_name_par)
    { name = (char*) field_name_par; }
  const char *full_name() const;
126
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
127 128
};

129

bk@work.mysql.com's avatar
bk@work.mysql.com committed
130 131 132 133 134 135 136 137 138 139 140 141 142
class Item_field :public Item_ident
{
  void set_field(Field *field);
public:
  Field *field,*result_field;
  // Item_field() {}

  Item_field(const char *db_par,const char *table_name_par,
	     const char *field_name_par)
    :Item_ident(db_par,table_name_par,field_name_par),field(0),result_field(0)
  {}
  Item_field(Field *field);
  enum Type type() const { return FIELD_ITEM; }
143
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
144 145 146 147 148 149
  double val();
  longlong val_int();
  String *val_str(String*);
  double val_result();
  longlong val_int_result();
  String *str_result(String* tmp);
150 151 152 153
  bool send(THD *thd, String *str_arg)
  {
    return result_field->send(thd,str_arg);
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
154 155
  void make_field(Send_field *field);
  bool fix_fields(THD *,struct st_table_list *);
156
  bool save_in_field(Field *field,bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
157 158 159 160 161 162
  void save_org_in_field(Field *field);
  table_map used_tables() const;
  enum Item_result result_type () const
  {
    return field->result_type();
  }
163
  Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
164 165 166
  bool get_date(TIME *ltime,bool fuzzydate);
  bool get_date_result(TIME *ltime,bool fuzzydate);
  bool get_time(TIME *ltime);
167
  bool is_null() { return field->is_null(); }
168
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
169 170 171 172 173 174 175 176 177
};


class Item_null :public Item
{
public:
  Item_null(char *name_par=0)
    { maybe_null=null_value=TRUE; name= name_par ? name_par : (char*) "NULL";}
  enum Type type() const { return NULL_ITEM; }
178
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
179 180 181 182
  double val();
  longlong val_int();
  String *val_str(String *str);
  void make_field(Send_field *field);
183
  bool save_in_field(Field *field, bool no_conversions);
184
  bool save_safe_in_field(Field *field);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
185 186
  enum Item_result result_type () const
  { return STRING_RESULT; }
187
  bool send(THD *thd, String *str);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
188 189
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_null(name); }
190
  bool is_null() { return 1; }
191
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
};


class Item_int :public Item
{
public:
  const longlong value;
  Item_int(int32 i,uint length=11) :value((longlong) i)
    { max_length=length;}
#ifdef HAVE_LONG_LONG
  Item_int(longlong i,uint length=21) :value(i)
    { max_length=length;}
#endif
  Item_int(const char *str_arg,longlong i,uint length) :value(i)
    { max_length=length; name=(char*) str_arg;}
  Item_int(const char *str_arg) :
    value(str_arg[0] == '-' ? strtoll(str_arg,(char**) 0,10) :
	  (longlong) strtoull(str_arg,(char**) 0,10))
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
210
    { max_length= (uint) strlen(str_arg); name=(char*) str_arg;}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
211 212 213 214 215 216
  enum Type type() const { return INT_ITEM; }
  virtual enum Item_result result_type () const { return INT_RESULT; }
  longlong val_int() { return value; }
  double val() { return (double) value; }
  String *val_str(String*);
  void make_field(Send_field *field);
217
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
218 219 220
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_int(name,value,max_length); }
  void print(String *str);
221
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
222 223 224
};


225 226 227 228 229
class Item_uint :public Item_int
{
public:
  Item_uint(const char *str_arg, uint length) :
    Item_int(str_arg, (longlong) strtoull(str_arg,(char**) 0,10), length) {}
230
  Item_uint(uint32 i) :Item_int((longlong) i, 10) {}
231 232 233 234
  double val() { return ulonglong2double(value); }
  String *val_str(String*);
  void make_field(Send_field *field);
  Item *new_item() { return new Item_uint(name,max_length); }
235 236 237 238 239
  bool fix_fields(THD *thd,struct st_table_list *table_list)
  {
    unsigned_flag= 1;
    return 0;
  }
240
  void print(String *str);
241
  unsigned int size_of() { return sizeof(*this);}  
242 243 244
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
245 246 247 248 249 250 251 252
class Item_real :public Item
{
public:
  const double value;
  // Item_real() :value(0) {}
  Item_real(const char *str_arg,uint length) :value(atof(str_arg))
  {
    name=(char*) str_arg;
253
    decimals=(uint8) nr_of_decimals(str_arg);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
254 255 256 257 258 259
    max_length=length;
  }
  Item_real(const char *str,double val_arg,uint decimal_par,uint length)
    :value(val_arg)
  {
    name=(char*) str;
260
    decimals=(uint8) decimal_par;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
261 262 263
    max_length=length;
  }
  Item_real(double value_par) :value(value_par) {}
264
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
265 266 267 268 269 270 271
  enum Type type() const { return REAL_ITEM; }
  double val() { return value; }
  longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));}
  String *val_str(String*);
  void make_field(Send_field *field);
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_real(name,value,decimals,max_length); }
272
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
273 274 275 276 277 278 279 280 281 282 283
};


class Item_float :public Item_real
{
public:
  Item_float(const char *str,uint length) :Item_real(str,length)
  {
    decimals=NOT_FIXED_DEC;
    max_length=DBL_DIG+8;
  }
284
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
};

class Item_string :public Item
{
public:
  Item_string(const char *str,uint length)
  {
    str_value.set(str,length);
    max_length=length;
    name=(char*) str_value.ptr();
    decimals=NOT_FIXED_DEC;
  }
  Item_string(const char *name_par,const char *str,uint length)
  {
    str_value.set(str,length);
    max_length=length;
    name=(char*) name_par;
    decimals=NOT_FIXED_DEC;
  }
  ~Item_string() {}
  enum Type type() const { return STRING_ITEM; }
  double val() { return atof(str_value.ptr()); }
  longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); }
  String *val_str(String*) { return (String*) &str_value; }
309
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
310 311 312
  void make_field(Send_field *field);
  enum Item_result result_type () const { return STRING_RESULT; }
  bool basic_const_item() const { return 1; }
313
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
314 315 316 317
  Item *new_item() { return new Item_string(name,str_value.ptr(),max_length); }
  String *const_string() { return &str_value; }
  inline void append(char *str,uint length) { str_value.append(str,length); }
  void print(String *str);
318
  unsigned int size_of() { return sizeof(*this);}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
319 320
};

321 322 323 324 325 326 327 328 329

/* For INSERT ... VALUES (DEFAULT) */

class Item_default :public Item
{
public:
  Item_default() { name= (char*) "DEFAULT"; }
  enum Type type() const { return DEFAULT_ITEM; }
  void make_field(Send_field *field) {}
330
  bool save_in_field(Field *field, bool no_conversions)
331 332 333 334 335 336 337 338 339 340 341 342
  {
    field->set_default();
    return 0;
  }
  virtual double val() { return 0.0; }
  virtual longlong val_int() { return 0; }
  virtual String *val_str(String *str) { return 0; }
  bool basic_const_item() const { return 1; }
  unsigned int size_of() { return sizeof(*this);}
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
343 344 345 346 347 348 349 350
/* for show tables */

class Item_datetime :public Item_string
{
public:
  Item_datetime(const char *item_name): Item_string(item_name,"",0)
  { max_length=19;}
  void make_field(Send_field *field);
351
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
352 353 354 355 356 357 358
};

class Item_empty_string :public Item_string
{
public:
  Item_empty_string(const char *header,uint length) :Item_string("",0)
    { name=(char*) header; max_length=length;}
359
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
360 361 362 363 364 365 366 367 368 369 370
};

class Item_varbinary :public Item
{
public:
  Item_varbinary(const char *str,uint str_length);
  ~Item_varbinary() {}
  enum Type type() const { return VARBIN_ITEM; }
  double val() { return (double) Item_varbinary::val_int(); }
  longlong val_int();
  String *val_str(String*) { return &str_value; }
371
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
372
  void make_field(Send_field *field);
373
  enum Item_result result_type () const;
374
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
375 376 377 378 379 380 381 382 383
};


class Item_result_field :public Item	/* Item with result field */
{
public:
  Field *result_field;				/* Save result here */
  Item_result_field() :result_field(0) {}
  ~Item_result_field() {}			/* Required with gcc 2.95 */
384
  Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
385
  table_map used_tables() const { return 1; }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
386
  virtual void fix_length_and_dec()=0;
387
  unsigned int size_of() { return sizeof(*this);}  
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
388 389 390 391 392 393
  void set_result_field(Field *field) { result_field= field; }
  bool is_result_field() { return 1; }
  void save_in_result_field(bool no_conversions)
  {
    save_in_field(result_field, no_conversions);
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
394 395 396 397 398 399
};


class Item_ref :public Item_ident
{
public:
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
400
  Field *result_field;				/* Save result here */
serg@serg.mysql.com's avatar
serg@serg.mysql.com committed
401
  Item **ref;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
402 403 404 405 406
  Item_ref(char *db_par,char *table_name_par,char *field_name_par)
    :Item_ident(db_par,table_name_par,field_name_par),ref(0) {}
  Item_ref(Item **item, char *table_name_par,char *field_name_par)
    :Item_ident(NullS,table_name_par,field_name_par),ref(item) {}
  enum Type type() const		{ return REF_ITEM; }
407 408
  bool eq(const Item *item, bool binary_cmp) const
  { return (*ref)->eq(item, binary_cmp); }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
  ~Item_ref() { if (ref) delete *ref; }
  double val()
  {
    double tmp=(*ref)->val_result();
    null_value=(*ref)->null_value;
    return tmp;
  }
  longlong val_int()
  {
    longlong tmp=(*ref)->val_int_result();
    null_value=(*ref)->null_value;
    return tmp;
  }
  String *val_str(String* tmp)
  {
    tmp=(*ref)->str_result(tmp);
    null_value=(*ref)->null_value;
    return tmp;
  }
428 429 430 431 432
  bool is_null()
  {
    (void) (*ref)->val_int_result();
    return (*ref)->null_value;
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
433
  bool get_date(TIME *ltime,bool fuzzydate)
434 435
  {
    return (null_value=(*ref)->get_date_result(ltime,fuzzydate));
bk@work.mysql.com's avatar
bk@work.mysql.com committed
436
  }
437
  bool send(THD *thd, String *tmp)	{ return (*ref)->send(thd, tmp); }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
438 439
  void make_field(Send_field *field)	{ (*ref)->make_field(field); }
  bool fix_fields(THD *,struct st_table_list *);
440 441
  bool save_in_field(Field *field, bool no_conversions)
  { return (*ref)->save_in_field(field, no_conversions); }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
442 443 444
  void save_org_in_field(Field *field)	{ (*ref)->save_org_in_field(field); }
  enum Item_result result_type () const { return (*ref)->result_type(); }
  table_map used_tables() const		{ return (*ref)->used_tables(); }
445
  unsigned int size_of() { return sizeof(*this);}  
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
446 447 448 449 450 451
  void set_result_field(Field *field) { result_field= field; }
  bool is_result_field() { return 1; }
  void save_in_result_field(bool no_conversions)
  {
    (*ref)->save_in_field(result_field, no_conversions);
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
452 453 454
};


455 456 457 458 459 460 461 462 463 464 465 466
/*
  The following class is used to optimize comparing of date columns
  We need to save the original item, to be able to set the field to the
  original value in 'opt_range'.
*/

class Item_int_with_ref :public Item_int
{
  Item *ref;
public:
  Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg)
  {}
467
  bool save_in_field(Field *field, bool no_conversions)
468
  {
469
    return ref->save_in_field(field, no_conversions);
470
  }
471
  unsigned int size_of() { return sizeof(*this);}  
472 473 474
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
#include "item_sum.h"
#include "item_func.h"
#include "item_cmpfunc.h"
#include "item_strfunc.h"
#include "item_timefunc.h"
#include "item_uniq.h"

class Item_copy_string :public Item
{
public:
  Item *item;
  Item_copy_string(Item *i) :item(i)
  {
    null_value=maybe_null=item->maybe_null;
    decimals=item->decimals;
    max_length=item->max_length;
    name=item->name;
  }
  ~Item_copy_string() { delete item; }
  enum Type type() const { return COPY_STR_ITEM; }
  enum Item_result result_type () const { return STRING_RESULT; }
  double val()
  { return null_value ? 0.0 : atof(str_value.c_ptr()); }
  longlong val_int()
  { return null_value ? LL(0) : strtoll(str_value.c_ptr(),(char**) 0,10); }
  String *val_str(String*);
  void make_field(Send_field *field) { item->make_field(field); }
  void copy();
  table_map used_tables() const { return (table_map) 1L; }
  bool const_item() const { return 0; }
505
  bool is_null() { return null_value; }
506
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
507 508 509 510 511 512 513 514 515 516
};


class Item_buff :public Sql_alloc
{
public:
  my_bool null_value;
  Item_buff() :null_value(0) {}
  virtual bool cmp(void)=0;
  virtual ~Item_buff(); /*line -e1509 */
517
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
518 519 520 521 522 523 524 525 526 527
};

class Item_str_buff :public Item_buff
{
  Item *item;
  String value,tmp_value;
public:
  Item_str_buff(Item *arg) :item(arg),value(arg->max_length) {}
  bool cmp(void);
  ~Item_str_buff();				// Deallocate String:s
528
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
529 530 531 532 533 534 535 536 537 538
};


class Item_real_buff :public Item_buff
{
  Item *item;
  double value;
public:
  Item_real_buff(Item *item_par) :item(item_par),value(0.0) {}
  bool cmp(void);
539
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
540 541 542 543 544 545 546 547 548
};

class Item_int_buff :public Item_buff
{
  Item *item;
  longlong value;
public:
  Item_int_buff(Item *item_par) :item(item_par),value(0) {}
  bool cmp(void);
549
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
};


class Item_field_buff :public Item_buff
{
  char *buff;
  Field *field;
  uint length;

public:
  Item_field_buff(Item_field *item)
  {
    field=item->field;
    buff= (char*) sql_calloc(length=field->pack_length());
  }
  bool cmp(void);
566
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
567 568 569 570 571 572
};

extern Item_buff *new_Item_buff(Item *item);
extern Item_result item_cmp_type(Item_result a,Item_result b);
extern Item *resolve_const_item(Item *item,Item *cmp_item);
extern bool field_is_equal_to_item(Field *field,Item *item);