bug (16/26)

Brian Grossman briang@gomer.fc.hp.com
Tue Sep 8 21:44:00 GMT 1998


	      bool zero_arg, bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       0, zero_arg,unsigned_arg)
    {}
  enum Item_result result_type () const { return INT_RESULT; }
  enum_field_types type() const { return FIELD_TYPE_SHORT;}
  enum ha_base_keytype key_type() const
    { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 2; }
  void sql_type(String &str) const;
};


class Field_medium :public Field_num {
public:
  Field_medium(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	      uint null_bit_arg,
	      enum utype unireg_check_arg, char *field_name_arg,
	      struct st_table *table_arg,
	      bool zero_arg, bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       0, zero_arg,unsigned_arg)
    {}
  enum Item_result result_type () const { return INT_RESULT; }
  enum_field_types type() const { return FIELD_TYPE_INT24;}
  enum ha_base_keytype key_type() const
    { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 3; }
  void sql_type(String &str) const;
};


class Field_long :public Field_num {
public:
  Field_long(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	     uint null_bit_arg,
	     enum utype unireg_check_arg, char *field_name_arg,
	     struct st_table *table_arg,
	     bool zero_arg, bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       0, zero_arg,unsigned_arg)
    {}
  Field_long(uint len_arg,bool maybe_null, char *field_name_arg,
	     struct st_table *table_arg,bool unsigned_arg)
    :Field_num((char*) 0, len_arg, maybe_null ? (uchar*) "": 0,0,
	       NONE, field_name_arg, table_arg,0,0,unsigned_arg)
    {}
  enum Item_result result_type () const { return INT_RESULT; }
  enum_field_types type() const { return FIELD_TYPE_LONG;}
  enum ha_base_keytype key_type() const
    { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 4; }
  void sql_type(String &str) const;
};



class Field_longlong :public Field_num {
public:
  Field_longlong(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	      uint null_bit_arg,
	      enum utype unireg_check_arg, char *field_name_arg,
	      struct st_table *table_arg,
	      bool zero_arg, bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       0, zero_arg,unsigned_arg)
    {}
  Field_longlong(uint len_arg,bool maybe_null, char *field_name_arg,
		 struct st_table *table_arg)
    :Field_num((char*) 0, len_arg, maybe_null ? (uchar*) "": 0,0,
	       NONE, field_name_arg, table_arg,0,0,0)
    {}
  enum Item_result result_type () const { return INT_RESULT; }
  enum_field_types type() const { return FIELD_TYPE_LONGLONG;}
  enum ha_base_keytype key_type() const
    { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 8; }
  void sql_type(String &str) const;
};


class Field_float :public Field_num {
public:
  Field_float(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	      uint null_bit_arg,
	      enum utype unireg_check_arg, char *field_name_arg,
	      struct st_table *table_arg,
	       uint dec_arg,bool zero_arg,bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       dec_arg, zero_arg,unsigned_arg)
    {}
  enum_field_types type() const { return FIELD_TYPE_FLOAT;}
  enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return sizeof(float); }
  void sql_type(String &str) const;
};


class Field_double :public Field_num {
public:
  Field_double(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	       uint null_bit_arg,
	       enum utype unireg_check_arg, char *field_name_arg,
	       struct st_table *table_arg,
	       uint dec_arg,bool zero_arg,bool unsigned_arg)
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg,
	       dec_arg, zero_arg,unsigned_arg)
    {}
  Field_double(uint len_arg, bool maybe_null, char *field_name_arg,
	       struct st_table *table_arg, uint dec_arg)
    :Field_num((char*) 0, len_arg, maybe_null ? (uchar*) "": 0, (uint) 0,
	       NONE, field_name_arg, table_arg,dec_arg,0,0)
    {}
  enum_field_types type() const { return FIELD_TYPE_DOUBLE;}
  enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return sizeof(double); }
  void sql_type(String &str) const;
};


 

class Field_null :public Field_str {
  static uchar null[1];
public:
  Field_null(char *ptr_arg, uint len_arg,
	     enum utype unireg_check_arg, char *field_name_arg,
	     struct st_table *table_arg)
    :Field_str(ptr_arg, len_arg, null, 1,
	       unireg_check_arg, field_name_arg, table_arg)
    {}
  enum_field_types type() const { return FIELD_TYPE_NULL;}
  void store(const char *to,uint length) { null[0]=1; }
  void store(double nr  )   { null[0]=1; }
  void store(longlong nr  ) { null[0]=1; }
  double val_real(void)		{ return 0.0;}
  longlong val_int(void)	{ return 0;}
  void val_str(String *value)	{ value->length(0); }
  int cmp(const char *a,const char* b) { return 0;}
  void sort_string(char *buff,uint length)  {}
  uint pack_length() const { return 0; }
  void sql_type(String &str) const { str.set("null",4); }
  uint size_of() const { return sizeof(*this); }
};


class Field_timestamp :public Field_num {
public:
  Field_timestamp(char *ptr_arg, uint len_arg,
		  enum utype unireg_check_arg, char *field_name_arg,
		  struct st_table *table_arg);
  enum Item_result result_type () const { return INT_RESULT; }
  enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
  enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 4; }
  void sql_type(String &str) const;
  bool store_for_compare() { return 1; }
  inline void set_time()
    {
      long skr= (long) time((time_t*) 0);
      { *(( ptr )+3)=(( skr ));	*(( ptr )+2)=((( skr ) >> 8));	*(( ptr )+1)=((( skr ) >> 16));	*(( ptr )+0)=((( skr ) >> 24)); } ;
    }
  inline long get_time()
    {
      long tmp;
      { int32 def_temp;	((byte*) &def_temp)[0]=( ptr )[0];	((byte*) &def_temp)[1]=( ptr )[1];	((byte*) &def_temp)[2]=( ptr )[2];	((byte*) &def_temp)[3]=( ptr )[3];	( tmp )=def_temp; } ;
      return tmp;
    }
  void fill_and_store(char *from,uint len);
};


class Field_date :public Field_str {
public:
  Field_date(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
	     enum utype unireg_check_arg, char *field_name_arg,
	     struct st_table *table_arg)
    :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg)
    {}
  enum_field_types type() const { return FIELD_TYPE_DATE;}
  enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
  enum Item_result cmp_type () const { return INT_RESULT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 4; }
  void sql_type(String &str) const;
  bool store_for_compare() { return 1; }
};


class Field_time :public Field_str {
public:
  Field_time(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
	     enum utype unireg_check_arg, char *field_name_arg,
	     struct st_table *table_arg)
    :Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg)
    {}
  enum_field_types type() const { return FIELD_TYPE_TIME;}
  enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; }
  enum Item_result cmp_type () const { return INT_RESULT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 3; }
  void sql_type(String &str) const;
  bool store_for_compare() { return 1; }
};


class Field_datetime :public Field_str {
public:
  Field_datetime(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
		 enum utype unireg_check_arg, char *field_name_arg,
		 struct st_table *table_arg)
    :Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg)
    {}
  enum_field_types type() const { return FIELD_TYPE_DATETIME;}

  enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }

  enum Item_result cmp_type () const { return INT_RESULT; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return 8; }
  void sql_type(String &str) const;
  bool store_for_compare() { return 1; }
};


class Field_string :public Field_str {
  bool binary_flag;
public:
  Field_string(char *ptr_arg, uint len_arg,uchar *null_ptr_arg,
	       uint null_bit_arg,
	       enum utype unireg_check_arg, char *field_name_arg,
	       struct st_table *table_arg,bool binary_arg)
    :binary_flag(binary_arg),
     Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg)
    {
      if (binary_arg)
	flags|= 128 ;
    }
  Field_string(uint len_arg,bool maybe_null, char *field_name_arg,
	       struct st_table *table_arg, bool binary_arg)
    :binary_flag(binary_arg),
     Field_str(__null ,len_arg, maybe_null ? (uchar*) "": 0,0,
	       NONE, field_name_arg, table_arg)
    {
      if (binary_arg)
	flags|= 128 ;
    }

  enum_field_types type() const { return FIELD_TYPE_STRING;}
  enum ha_base_keytype key_type() const
    { return binary_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
  bool zero_pack() const { return 0; }
  bool binary() const { return binary_flag; }
  void reset(void) { memset(( ptr ),( ' ' ),( field_length )) ; }
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  void sql_type(String &str) const;
  uint size_of() const { return sizeof(*this); }
};


class Field_blob :public Field_str {
  uint packlength;
  String value;					 
  bool binary_flag;
public:
  Field_blob(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
	     enum utype unireg_check_arg, char *field_name_arg,
	     struct st_table *table_arg,uint blob_pack_length,
	     bool binary_arg);
  enum_field_types type() const { return FIELD_TYPE_BLOB;}
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return packlength+sizeof(char*); }
  void store_length(ulong number);
  ulong get_length(void);
  bool binary() const { return binary_flag; }
  inline void get_ptr(char **str)
    {
      memcpy(str,ptr+packlength,sizeof(char*));
    }
  inline void set_ptr(char *length,char *data)
    {
      memcpy(ptr,length,packlength);
      memcpy(ptr+packlength,&data,sizeof(char*));
    }
  void sql_type(String &str) const;
  void free() { value.free(); }
  friend void field_conv(Field *to,Field *from);
  uint size_of() const { return sizeof(*this); }
};


class Field_enum :public Field_str {
protected:
  uint packlength;
public:
  TYPELIB *typelib;
  Field_enum(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
		 uint null_bit_arg,
		 enum utype unireg_check_arg, char *field_name_arg,
		 struct st_table *table_arg,uint packlength_arg,
		 TYPELIB *typelib_arg)
    :typelib(typelib_arg),packlength(packlength_arg),
     Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
	       unireg_check_arg, field_name_arg, table_arg)
    {
      flags|= 256 ;
    }
  enum_field_types type() const { return FIELD_TYPE_STRING; }
  enum Item_result cmp_type () const { return INT_RESULT; }
  enum ha_base_keytype key_type() const;
  void store(const char *to,uint length);
  void store(double nr);
  void store(longlong nr);
  double val_real(void);
  longlong val_int(void);
  void val_str(String*);
  int cmp(const char *,const char*);
  void sort_string(char *buff,uint length);
  uint pack_length() const { return packlength; }
  void store_type(ulonglong value);
  void sql_type(String &str) const;
  uint size_of() const { return sizeof(*this); }
  enum_field_types real_type() const { return FIELD_TYPE_ENUM; }
  bool optimize_range() { return 0; }
};


class Field_set :public Field_enum {
public:
  Field_set(char *ptr_arg, uint len_arg, uchar *null_ptr_arg,
	    uint null_bit_arg,
	    enum utype unireg_check_arg, char *field_name_arg,
	    struct st_table *table_arg,uint packlength_arg,
	    TYPELIB *typelib_arg)
    :Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
		    unireg_check_arg, field_name_arg,
		    table_arg, packlength_arg,
		    typelib_arg)
    {}
  void store(const char *to,uint length);
  void store(double nr) { store((longlong) nr); }
  void store(longlong nr);
  void val_str(String*);
  void sql_type(String &str) const;
  enum_field_types real_type() const { return FIELD_TYPE_SET; }
};


 



class create_field :public Sql_alloc {
public:
  char	*field_name;
  char	*change;				 
  Item	*def;					 
  enum	enum_field_types sql_type;
  uint	length,decimals,flags,pack_length;
  Field::utype unireg_check;
  TYPELIB *interval;				 
  Field *field;					 

  uint8 row,col,sc_length;			 
  uint	offset,pack_flag;
  create_field() {}
  create_field(Field *field);
};


 



class Send_field {
 public:
  char *table_name,*col_name;
  uint length,flags,decimals;
  enum_field_types type;
  Send_field() {}
};


 



class Copy_field :public Sql_alloc {
  void (*get_copy_func(Field *to,Field *from))(Copy_field *);
public:
  char *from_ptr,*to_ptr;
  uchar *from_null_ptr,*to_null_ptr;
  my_bool *null_row;
  uint	from_bit,to_bit;
  uint from_length,to_length;
  Field *from_field,*to_field;
  String tmp;					 

  Copy_field() {}
  ~Copy_field() {}
  void set(Field *to,Field *from,bool save);	 
  void set(char *to,Field *from);		 
  void (*do_copy)(Copy_field *);
  void (*do_copy2)(Copy_field *);		 
};


Field *make_field(char *ptr, uint field_length,
		  uchar *null_pos, uint null_bit,
		  uint pack_flag, Field::utype unireg_check,
		  TYPELIB *interval, char *field_name,
		  struct st_table *table);
uint pack_length_to_packflag(uint type);
uint calc_pack_length(enum_field_types type,uint length);
bool set_field_to_null(Field *field);
uint find_enum(TYPELIB *typelib,const char *x, uint length);
ulonglong find_set(TYPELIB *typelib,const char *x, uint length);

 








































# 130 "mysql_priv.h" 2

# 1 "sql_udf.h" 1
 














 


#pragma interface


typedef struct st_udf_func
{
  char *name;
  int name_length;
  Item_result returns;
  char *dl;
  void *dlhandle;
  void *func;
  void *func_init;
  void *func_deinit;
  ulong usage_count;
} udf_func;
	







# 131 "mysql_priv.h" 2

# 1 "item.h" 1
 














#pragma interface			


struct st_table_list;
void item_init(void);			 

class Item :public Sql_alloc {
public:
  enum Type {FIELD_ITEM,FUNC_ITEM,SUM_FUNC_ITEM,STRING_ITEM,
	     INT_ITEM,REAL_ITEM,NULL_ITEM,VARBIN_ITEM,
	     COPY_STR_ITEM,FIELD_AVG_ITEM,
	     PROC_ITEM,COND_ITEM,REF_ITEM,FIELD_STD_ITEM};
  enum cond_result { COND_UNDEF,COND_OK,COND_TRUE,COND_FALSE };

  my_bool maybe_null;			 
  my_bool null_value;			 
  my_bool binary;
  my_bool with_sum_func;

  uint8 marker,decimals;
  uint	max_length;
  my_string name;			 
  String str_value;			 
  Item *next;

   
  Item();
  virtual ~Item() { name=0; }		 
  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 *);
  virtual bool save_in_field(Field *field);
  virtual void save_org_in_field(Field *field)
    { (void) save_in_field(field); }
  virtual bool send(String *str);
  virtual bool eq(const Item *) const;
  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 *str(String*)=0;
  virtual void make_field(Send_field *field)=0;
  virtual Field *tmp_table_field() { return 0; }
  virtual char *full_name() { return name ? name : "???"; }
  virtual double val_result() { return val(); }
  virtual longlong val_int_result() { return val_int(); }
  virtual String *str_result(String* tmp) { return 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; }	 
  virtual cond_result eq_cmp_result() const { return COND_OK; }
  inline uint float_length(uint decimals_par) const {return (13+decimals_par);}
  inline bool const_item() const { return used_tables() == 0; }
  virtual void print(String *str) { str->append(full_name()); }
  virtual void update_used_tables() {}
  virtual void split_sum_func(List<Item> &fields) { return; }
};


class Item_ident :public Item
{
public:
  char *table_name,*field_name;
  Item_ident(char *table_name_par,char *field_name_par)
    :table_name(table_name_par),field_name(field_name_par)
    { name = field_name_par; }
  char *full_name();
};

class Item_field :public Item_ident
{
  void set_field(Field *field);
public:
  Field *field,*result_field;
   

  Item_field(char *table_name_par,char *field_name_par)
    :field(0),result_field(0),Item_ident(table_name_par,field_name_par) {}
  Item_field(Field *field);
  enum Type type() const { return FIELD_ITEM; }
  bool eq(const Item *item) const;
  double val();
  longlong val_int();
  String *str(String*);
  double val_result();
  longlong val_int_result();
  String *str_result(String* tmp);
  bool send(String *str) { return result_field->send(str); }
  void make_field(Send_field *field);
  bool fix_fields(THD *,struct st_table_list *);
  bool save_in_field(Field *field);
  void save_org_in_field(Field *field);
  table_map used_tables() const;
  enum Item_result result_type () const
  {
    return field->result_type();
  }
  Field *tmp_table_field() { return result_field; }
};


class Item_null :public Item
{
public:
  Item_null(char *name_par=0)
    { maybe_null=null_value= (1) ; name= name_par ? name_par : "NULL";}
  enum Type type() const { return NULL_ITEM; }
  bool eq(const Item *item) const;
  double val();
  longlong val_int();
  String *str(String *str);
  void make_field(Send_field *field);
  bool save_in_field(Field *field);
  enum Item_result result_type () const
  { return STRING_RESULT; }
  bool send(String *str);
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_null(name); }
};


class Item_int :public Item
{
public:
  const longlong value;
  Item_int(int32 i,uint length=11) :value((longlong) i)
    { max_length=length;}

  Item_int(longlong i,uint length=21) :value(i)
    { max_length=length;}

  Item_int(char *str,longlong i,uint length) :value(i)
    { max_length=length; name=str;}
  Item_int(const char *str) :
    value(str[0] == '-' ? strtoll(str,__null ,10) :
	  (longlong) strtoull(str,__null ,10))
    { max_length=strlen(str); name=(char*) str;}
  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 *str(String*);
  void make_field(Send_field *field);
  bool save_in_field(Field *field);
  bool basic_const_item() const { return 1; }
  Item *new_item() { return new Item_int(name,value,max_length); }
  void print(String *str);
};


class Item_real :public Item
{
public:
  const double value;
   
  Item_real(const char *str) :value(atof(str))
  {
    name=(char*) str;
    this->decimals=nr_of_decimals(str);
    max_length=strlen(str);
  }
  Item_real(const char *str,double val,uint decimal_par,uint length) :value(val)
  {
    name=(char*) str;
    decimals=decimal_par;
    max_length=length;
  }
  Item_real(double value_par) :value(value_par) {}
  bool save_in_field(Field *field);
  enum Type type() const { return REAL_ITEM; }
  double val() { return value; }
  longlong val_int() { return (longlong) (value+0.5);}
  String *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); }
};


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();
  }
  Item_string(char *name_par,const char *str,uint length)
  {
    str_value.set(str,length);
    max_length=length;
    name=name_par;
  }
  ~Item_string() {}
  enum Type type() const { return STRING_ITEM; }
  double val() { return atof(str_value.ptr()); }
  longlong val_int() { return strtoll(str_value.ptr(),__null ,10); }
  String *str(String*) { return (String*) &str_value; }
  bool save_in_field(Field *field);
  void make_field(Send_field *field);
  enum Item_result result_type () const { return STRING_RESULT; }
  bool basic_const_item() const { return 1; }
  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); }
};


class Item_empty_string :public Item_string
{
public:
  Item_empty_string(char *header,uint length) :Item_string("",0)
    { name=header; max_length=length;}
};

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) val_int(); }
  longlong val_int();
  String *str(String*) { return &str_value; }
  bool save_in_field(Field *field);
  void make_field(Send_field *field);
  enum Item_result result_type () const { return STRING_RESULT; }
};


class Item_result_field :public Item	 
{
public:
  Field *result_field;			 
  Item_result_field() :result_field(0) {}
  Field *tmp_table_field() { return result_field; }
};


class Item_ref :public Item_ident
{
  Item **ref;
public:
  Item_ref(char *table_name_par,char *field_name_par)
    :ref(0), Item_ident(table_name_par,field_name_par) {}
  Item_ref(Item **item, char *table_name_par,char *field_name_par)
    :ref(item), Item_ident(table_name_par,field_name_par) {}
  enum Type type() const		{ return REF_ITEM; }
  bool eq(const Item *item) const	{ return (*ref)->eq(item); }
  ~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 *str(String* tmp)
  {
    tmp=(*ref)->str_result(tmp);
    null_value=(*ref)->null_value;
    return tmp;
  }
  bool send(String *tmp)		{ return (*ref)->send(tmp); }
  void make_field(Send_field *field)	{ (*ref)->make_field(field); }
  bool fix_fields(THD *,struct st_table_list *);
  bool save_in_field(Field *field)	{ return (*ref)->save_in_field(field); }
  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(); }
};


# 1 "item_sum.h" 1
 













 


#pragma interface			


class Item_sum :public Item_result_field
{
public:
  enum Sumfunctype {COUNT_FUNC,SUM_FUNC,AVG_FUNC,MIN_FUNC,MAX_FUNC,
		    UNIQUE_USERS_FUNC,STD_FUNC,SUM_BIT_FUNC };
  Item *item;
  bool quick_group;

  Item_sum(Item *item_par) :item(item_par),quick_group(1) {}
  ~Item_sum() { delete item; result_field=0;}
  enum Type type() const { return SUM_FUNC_ITEM; }
  virtual enum Sumfunctype sum_func () const=0;
  virtual void reset()=0;
  virtual void add()=0;
  virtual void reset_field()=0;
  virtual void update_field(int offset)=0;
  virtual bool keep_field_type(void) const { return 0; }
  virtual void fix_length_and_dec() { maybe_null=1; null_value=1; }
  virtual char *func_name() const { return "?"; }
  ulong used_tables() const { return ~(table_map) 0; }
  void update_used_tables() { }
  void make_field(Send_field *field);
  void print(String *str);
};


class Item_sum_num :public Item_sum
{
public:
  Item_sum_num(Item *item_par) :Item_sum(item_par) {}
  bool fix_fields(THD *,struct st_table_list *);
  longlong val_int() { return (longlong) val(); }  
  String *str(String*str);
  void reset_field();
};


class Item_sum_int :public Item_sum_num
{
public:
  Item_sum_int(Item *item_par) :Item_sum_num(item_par) {}
  double val() { return (double) val_int(); }
  String *str(String*str);
  enum Item_result result_type () const { return INT_RESULT; }
};


class Item_sum_sum :public Item_sum_num
{
  double sum;
  void fix_length_and_dec() { maybe_null=null_value=0; }

  public:
  Item_sum_sum(Item *item_par) :Item_sum_num(item_par),sum(0.0) {}
  enum Sumfunctype sum_func () const {return SUM_FUNC;}
  void reset();
  void add();
  double val();
  void reset_field();
  void update_field(int offset);
  char *func_name() const { return "sum"; }
};


class Item_sum_count :public Item_sum_int
{
  ulong count;
  void fix_length_and_dec()
    { decimals=0; max_length=11; maybe_null=null_value=0; }

  public:
  Item_sum_count(Item *item_par) :Item_sum_int(item_par),count(0) {}
  enum Sumfunctype sum_func () const {return COUNT_FUNC;}
  void reset();
  void add();
  longlong val_int();
  void reset_field();




More information about the Gcc-bugs mailing list