item.h 17 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 74 75 76 77 78 79 80 81 82 83 84 85
  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); }
  virtual table_map used_tables() const { return (table_map) 0L; }
  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);
86
  virtual bool is_null() { return 0; }
87
  virtual unsigned int size_of()= 0;
88
  virtual void top_level_item() {}
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
89 90 91
  virtual void set_result_field(Field *field) {}
  virtual bool is_result_field() { return 0; }
  virtual void save_in_result_field(bool no_conversions) {}
92
  virtual void no_rows_in_result() {}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
93 94 95 96 97 98 99 100 101 102 103 104 105 106
};


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;
107
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
108 109
};

110

bk@work.mysql.com's avatar
bk@work.mysql.com committed
111 112 113 114 115 116 117 118 119 120 121 122 123
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; }
124
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
125 126 127 128 129 130
  double val();
  longlong val_int();
  String *val_str(String*);
  double val_result();
  longlong val_int_result();
  String *str_result(String* tmp);
131 132 133 134
  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
135 136
  void make_field(Send_field *field);
  bool fix_fields(THD *,struct st_table_list *);
137
  bool save_in_field(Field *field,bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
138 139 140 141 142 143
  void save_org_in_field(Field *field);
  table_map used_tables() const;
  enum Item_result result_type () const
  {
    return field->result_type();
  }
144
  Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
145 146
  bool get_date(TIME *ltime,bool fuzzydate);  
  bool get_time(TIME *ltime);  
147
  bool is_null() { return field->is_null(); }
148
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
149 150 151 152 153 154 155 156 157
};


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; }
158
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
159 160 161 162
  double val();
  longlong val_int();
  String *val_str(String *str);
  void make_field(Send_field *field);
163
  bool save_in_field(Field *field, bool no_conversions);
164
  bool save_safe_in_field(Field *field);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
165 166
  enum Item_result result_type () const
  { return STRING_RESULT; }
167
  bool send(THD *thd, String *str);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
168 169
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_null(name); }
170
  bool is_null() { return 1; }
171
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
};


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
190
    { max_length= (uint) strlen(str_arg); name=(char*) str_arg;}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
191 192 193 194 195 196
  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);
197
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
198 199 200
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_int(name,value,max_length); }
  void print(String *str);
201
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
202 203 204
};


205 206 207 208 209
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) {}
210
  Item_uint(uint32 i) :Item_int((longlong) i, 10) {}
211 212 213 214 215
  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); }
  void print(String *str);
216
  unsigned int size_of() { return sizeof(*this);}  
217 218 219
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
220 221 222 223 224 225 226 227
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;
228
    decimals=(uint8) nr_of_decimals(str_arg);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
229 230 231 232 233 234
    max_length=length;
  }
  Item_real(const char *str,double val_arg,uint decimal_par,uint length)
    :value(val_arg)
  {
    name=(char*) str;
235
    decimals=(uint8) decimal_par;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
236 237 238
    max_length=length;
  }
  Item_real(double value_par) :value(value_par) {}
239
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
240 241 242 243 244 245 246
  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); }
247
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
248 249 250 251 252 253 254 255 256 257 258
};


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;
  }
259
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
};

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; }
284
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
285 286 287
  void make_field(Send_field *field);
  enum Item_result result_type () const { return STRING_RESULT; }
  bool basic_const_item() const { return 1; }
288
  bool eq(const Item *item, bool binary_cmp) const;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
289 290 291 292
  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);
293
  unsigned int size_of() { return sizeof(*this);}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
294 295
};

296 297 298 299 300 301 302 303 304

/* 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) {}
305
  bool save_in_field(Field *field, bool no_conversions)
306 307 308 309 310 311 312 313 314 315 316 317
  {
    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
318 319 320 321 322 323 324 325
/* 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);
326
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
327 328 329 330 331 332 333
};

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;}
334
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
335 336 337 338 339 340 341 342 343 344 345
};

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; }
346
  bool save_in_field(Field *field, bool no_conversions);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
347 348
  void make_field(Send_field *field);
  enum Item_result result_type () const { return INT_RESULT; }
349
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
350 351 352 353 354 355 356 357 358
};


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 */
359
  Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
360
  table_map used_tables() const { return 1; }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
361
  virtual void fix_length_and_dec()=0;
362
  unsigned int size_of() { return sizeof(*this);}  
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
363 364 365 366 367 368
  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
369 370 371 372 373 374
};


class Item_ref :public Item_ident
{
public:
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
375
  Field *result_field;				/* Save result here */
serg@serg.mysql.com's avatar
serg@serg.mysql.com committed
376
  Item **ref;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
377 378 379 380 381
  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; }
382 383
  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
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
  ~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;
  }
403 404 405 406 407
  bool is_null()
  {
    (void) (*ref)->val_int_result();
    return (*ref)->null_value;
  }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
408 409 410 411
  bool get_date(TIME *ltime,bool fuzzydate)
  {  
    return (null_value=(*ref)->get_date(ltime,fuzzydate));
  }
412
  bool send(THD *thd, String *tmp)	{ return (*ref)->send(thd, tmp); }
bk@work.mysql.com's avatar
bk@work.mysql.com committed
413 414
  void make_field(Send_field *field)	{ (*ref)->make_field(field); }
  bool fix_fields(THD *,struct st_table_list *);
415 416
  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
417 418 419
  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(); }
420
  unsigned int size_of() { return sizeof(*this);}  
monty@mashka.mysql.fi's avatar
monty@mashka.mysql.fi committed
421 422 423 424 425 426
  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
427 428 429
};


430 431 432 433 434 435 436 437 438 439 440 441
/*
  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)
  {}
442
  bool save_in_field(Field *field, bool no_conversions)
443
  {
444
    return ref->save_in_field(field, no_conversions);
445
  }
446
  unsigned int size_of() { return sizeof(*this);}  
447 448 449
};


bk@work.mysql.com's avatar
bk@work.mysql.com committed
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479
#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; }
480
  bool is_null() { return null_value; }
481
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
482 483 484 485 486 487 488 489 490 491
};


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 */
492
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
493 494 495 496 497 498 499 500 501 502
};

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
503
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
504 505 506 507 508 509 510 511 512 513
};


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);
514
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
515 516 517 518 519 520 521 522 523
};

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);
524
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540
};


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);
541
  unsigned int size_of() { return sizeof(*this);}  
bk@work.mysql.com's avatar
bk@work.mysql.com committed
542 543 544 545 546 547
};

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);