Commit fd37c0be authored by unknown's avatar unknown

bug #251 - destroyed object reused - fixed

parent c65c342d
...@@ -50,7 +50,7 @@ class Field ...@@ -50,7 +50,7 @@ class Field
LEX_STRING comment; LEX_STRING comment;
ulong query_id; // For quick test of used fields ulong query_id; // For quick test of used fields
/* Field is part of the following keys */ /* Field is part of the following keys */
key_map key_start,part_of_key,part_of_sortkey; key_map key_start,part_of_key,part_of_sortkey;
enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL, enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD, CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
BIT_FIELD, TIMESTAMP_FIELD,CAPITALIZE,BLOB_FIELD}; BIT_FIELD, TIMESTAMP_FIELD,CAPITALIZE,BLOB_FIELD};
...@@ -134,6 +134,7 @@ class Field ...@@ -134,6 +134,7 @@ class Field
virtual void sort_string(char *buff,uint length)=0; virtual void sort_string(char *buff,uint length)=0;
virtual bool optimize_range(uint idx); virtual bool optimize_range(uint idx);
virtual bool store_for_compare() { return 0; } virtual bool store_for_compare() { return 0; }
virtual void free() {}
Field *new_field(MEM_ROOT *root, struct st_table *new_table) Field *new_field(MEM_ROOT *root, struct st_table *new_table)
{ {
Field *tmp= (Field*) memdup_root(root,(char*) this,size_of()); Field *tmp= (Field*) memdup_root(root,(char*) this,size_of());
...@@ -937,11 +938,11 @@ class Field_blob :public Field_str { ...@@ -937,11 +938,11 @@ class Field_blob :public Field_str {
int pack_cmp(const char *b, uint key_length); int pack_cmp(const char *b, uint key_length);
uint packed_col_length(const char *col_ptr, uint length); uint packed_col_length(const char *col_ptr, uint length);
uint max_packed_col_length(uint max_length); uint max_packed_col_length(uint max_length);
inline void free() { value.free(); } void free() { value.free(); }
inline void clear_temporary() { bzero((char*) &value,sizeof(value)); } inline void clear_temporary() { bzero((char*) &value,sizeof(value)); }
friend void field_conv(Field *to,Field *from); friend void field_conv(Field *to,Field *from);
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
bool has_charset(void) const bool has_charset(void) const
{ return charset() == &my_charset_bin ? FALSE : TRUE; } { return charset() == &my_charset_bin ? FALSE : TRUE; }
}; };
...@@ -949,7 +950,7 @@ class Field_blob :public Field_str { ...@@ -949,7 +950,7 @@ class Field_blob :public Field_str {
class Field_geom :public Field_blob { class Field_geom :public Field_blob {
public: public:
enum geometry_type geom_type; enum geometry_type geom_type;
Field_geom(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg, Field_geom(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
enum utype unireg_check_arg, const char *field_name_arg, enum utype unireg_check_arg, const char *field_name_arg,
struct st_table *table_arg,uint blob_pack_length, struct st_table *table_arg,uint blob_pack_length,
......
...@@ -4791,7 +4791,7 @@ free_tmp_table(THD *thd, TABLE *entry) ...@@ -4791,7 +4791,7 @@ free_tmp_table(THD *thd, TABLE *entry)
(void) ha_delete_table(entry->db_type,entry->real_name); (void) ha_delete_table(entry->db_type,entry->real_name);
/* free blobs */ /* free blobs */
for (Field **ptr=entry->field ; *ptr ; ptr++) for (Field **ptr=entry->field ; *ptr ; ptr++)
delete *ptr; (*ptr)->free();
my_free((gptr) entry->record[0],MYF(0)); my_free((gptr) entry->record[0],MYF(0));
free_io_cache(entry); free_io_cache(entry);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment