29 #include <drizzled/common_fwd.h>
30 #include <drizzled/sql_error.h>
31 #include <drizzled/type/decimal.h>
32 #include <drizzled/key_map.h>
33 #include <drizzled/sql_list.h>
34 #include <drizzled/structs.h>
35 #include <drizzled/charset.h>
36 #include <drizzled/item_result.h>
45 #define DATETIME_DEC 6
46 #define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
48 #define ASSERT_COLUMN_MARKED_FOR_READ assert(getTable() && (not getTable()->read_set || isReadSet()))
49 #define ASSERT_COLUMN_MARKED_FOR_WRITE assert(getTable() && (not getTable()->write_set || isWriteSet()))
51 const uint32_t max_field_size= (uint32_t) 4294967295U;
90 Table *getTable()
const
96 void setTable(Table *table_arg)
108 key_map part_of_key_not_clustered;
109 key_map part_of_sortkey;
132 bool isUnsigned()
const
134 return flags & UNSIGNED_FLAG;
142 uint16_t position()
const
147 void setPosition(uint32_t arg)
163 static void *
operator new(
size_t size);
164 static void *
operator new(
size_t size,
memory::Root *mem_root);
165 static void operator delete(
void *, size_t)
170 Field(
unsigned char *ptr_arg,
172 unsigned char *null_ptr_arg,
173 unsigned char null_bit_arg,
174 utype unireg_check_arg,
175 const char *field_name_arg);
178 bool hasDefault()
const
180 return not (flags & NO_DEFAULT_VALUE_FLAG);
184 virtual int store(
const char *to,
186 const charset_info_st *
const cs)=0;
187 virtual int store(
double nr)=0;
188 virtual int store(int64_t nr,
bool unsigned_val)=0;
189 virtual int store_decimal(
const type::Decimal *d)=0;
190 int store_and_check(enum_check_fields check_level,
193 const charset_info_st *
const cs);
200 virtual int store_time(type::Time <ime, type::timestamp_t t_type);
201 virtual double val_real()
const=0;
202 virtual int64_t val_int()
const =0;
203 virtual type::Decimal *val_decimal(type::Decimal *)
const;
204 String *val_str_internal(String *str)
const
206 return val_str(str, str);
221 virtual String *val_str(String*, String *)
const =0;
227 virtual bool str_needs_quotes() {
return false; }
228 virtual Item_result result_type ()
const=0;
229 virtual Item_result cmp_type ()
const {
return result_type(); }
230 virtual Item_result cast_to_int_type ()
const {
return result_type(); }
245 static bool type_can_have_key_part(enum_field_types);
255 static enum_field_types field_type_merge(enum_field_types, enum_field_types);
265 static Item_result result_merge_type(enum_field_types);
267 virtual bool eq(Field *field);
276 virtual bool eq_def(Field *field);
278 virtual bool is_timestamp()
const
288 virtual uint32_t pack_length()
const;
295 virtual uint32_t pack_length_in_rec()
const;
301 virtual uint32_t data_length();
307 virtual uint32_t used_length();
308 virtual uint32_t sort_length()
const;
316 virtual uint32_t max_data_length()
const;
317 virtual int reset(
void);
318 virtual void reset_fields();
319 virtual void set_default();
320 virtual bool binary()
const;
321 virtual bool zero_pack()
const;
322 virtual enum ha_base_keytype key_type()
const;
323 virtual uint32_t key_length()
const;
324 virtual enum_field_types type()
const =0;
325 virtual enum_field_types real_type()
const;
326 virtual int cmp_max(
const unsigned char *a,
const unsigned char *b, uint32_t max_len);
327 virtual int cmp(
const unsigned char *,
const unsigned char *)=0;
328 int cmp_internal(
const unsigned char *str) {
return cmp(ptr,str); }
329 virtual int cmp_binary(
const unsigned char *a,
const unsigned char *b,
330 uint32_t max_length=UINT32_MAX);
331 virtual int cmp_offset(uint32_t row_offset);
332 virtual int cmp_binary_offset(uint32_t row_offset);
333 virtual int key_cmp(
const unsigned char *a,
const unsigned char *b);
334 virtual int key_cmp(
const unsigned char *str, uint32_t length);
335 virtual uint32_t decimals()
const;
338 virtual uint32_t size_of()
const =0;
340 bool is_null(ptrdiff_t row_offset= 0)
const;
341 bool is_real_null(ptrdiff_t row_offset= 0)
const;
342 bool is_null_in_record(
const unsigned char *record)
const;
343 bool is_null_in_record_with_offset(ptrdiff_t offset)
const;
344 void set_null(ptrdiff_t row_offset= 0);
345 void set_notnull(ptrdiff_t row_offset= 0);
346 bool maybe_null(
void)
const;
347 bool real_maybe_null(
void)
const;
349 virtual void make_field(SendField *);
350 virtual void sort_string(
unsigned char *buff,uint32_t length)=0;
351 virtual bool optimize_range(uint32_t idx, uint32_t part);
363 virtual void free() {}
364 virtual Field *new_field(memory::Root*, Table*,
bool keep_type);
365 virtual Field *new_key_field(memory::Root *root, Table *new_table,
366 unsigned char *new_ptr,
367 unsigned char *new_null_ptr,
368 uint32_t new_null_bit);
370 Field* clone(memory::Root*, Table*);
371 void move_field(
unsigned char *ptr_arg,
unsigned char *null_ptr_arg,
unsigned char null_bit_arg)
374 null_ptr= null_ptr_arg;
375 null_bit= null_bit_arg;
377 void move_field(
unsigned char *ptr_arg) { ptr=ptr_arg; }
378 virtual void move_field_offset(ptrdiff_t ptr_diff)
380 ptr= ADD_TO_PTR(ptr,ptr_diff,
unsigned char*);
382 null_ptr= ADD_TO_PTR(null_ptr,ptr_diff,
unsigned char*);
384 virtual void get_image(
unsigned char *buff, uint32_t length,
const charset_info_st *
const)
386 memcpy(buff,ptr,length);
388 virtual void get_image(std::basic_string<unsigned char> &buff, uint32_t length,
const charset_info_st *
const)
390 buff.append(ptr,length);
392 virtual void set_image(
const unsigned char *buff,uint32_t length,
const charset_info_st *
const)
394 memcpy(ptr,buff,length);
423 get_image(buff, length, &my_charset_bin);
426 virtual uint32_t get_key_image(std::basic_string<unsigned char> &buff, uint32_t length)
428 get_image(buff, length, &my_charset_bin);
431 virtual void set_key_image(
const unsigned char *buff,uint32_t length)
433 set_image(buff,length, &my_charset_bin);
435 int64_t val_int_offset(uint32_t row_offset)
438 int64_t tmp=val_int();
443 int64_t val_int_internal(
const unsigned char *new_ptr)
445 unsigned char *old_ptr= ptr;
446 ptr=
const_cast<unsigned char*
>(new_ptr);
447 int64_t return_value= val_int();
452 String *val_str_internal(String *str,
const unsigned char *new_ptr)
454 unsigned char *old_ptr= ptr;
455 ptr=
const_cast<unsigned char*
>(new_ptr);
456 val_str_internal(str);
498 virtual unsigned char *pack(
unsigned char *to,
499 const unsigned char *from,
501 bool low_byte_first);
503 unsigned char *pack(
unsigned char *to,
const unsigned char *from);
535 virtual const unsigned char *unpack(
unsigned char* to,
536 const unsigned char *from,
538 bool low_byte_first);
543 const unsigned char *unpack(
unsigned char* to,
544 const unsigned char *from);
546 virtual unsigned char *pack_key(
unsigned char* to,
547 const unsigned char *from,
551 return pack(to, from, max_length, low_byte_first);
553 virtual const unsigned char *unpack_key(
unsigned char* to,
554 const unsigned char *from,
558 return unpack(to, from, max_length, low_byte_first);
560 virtual uint32_t max_packed_col_length(uint32_t max_length)
565 uint32_t offset(
const unsigned char *record)
567 return (uint32_t) (ptr - record);
569 void copy_from_tmp(
int offset);
570 uint32_t fill_cache_field(CacheField *copy);
571 virtual bool get_date(type::Time <ime,uint32_t fuzzydate)
const;
572 virtual bool get_time(type::Time <ime)
const;
573 virtual const charset_info_st *charset(
void)
const {
return &my_charset_bin; }
574 virtual const charset_info_st *sort_charset(
void)
const {
return charset(); }
575 virtual bool has_charset(
void)
const {
return false; }
576 virtual void set_charset(
const charset_info_st *
const)
578 virtual enum Derivation derivation(
void)
const
580 return DERIVATION_IMPLICIT;
603 bool set_warning(DRIZZLE_ERROR::enum_warning_level,
604 drizzled::error_t code,
605 int cuted_increment);
621 void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
622 drizzled::error_t code,
625 type::timestamp_t ts_type,
626 int cuted_increment);
641 void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
642 drizzled::error_t code,
644 type::timestamp_t ts_type,
645 int cuted_increment);
659 void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
660 const drizzled::error_t code,
662 type::timestamp_t ts_type);
663 bool check_overflow(
int op_result)
665 return (op_result == E_DEC_OVERFLOW);
679 int warn_if_overflow(
int op_result);
680 void init(Table *table_arg);
683 virtual uint32_t max_display_length()= 0;
685 virtual uint32_t is_equal(CreateField *new_field);
697 int64_t convert_decimal2int64_t(
const type::Decimal *val,
701 uint32_t char_length()
const
703 return field_length / charset()->mbmaxlen;
706 enum column_format_type column_format()
const
708 return (
enum column_format_type)
709 ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
713 virtual void hash(uint32_t *nr, uint32_t *nr2)
const;
714 friend bool reopen_table(Session *,Table *,
bool);
716 friend class CopyField;
717 friend class Item_avg_field;
718 friend class Item_std_field;
719 friend class Item_sum_num;
720 friend class Item_sum_sum;
721 friend class Item_sum_str;
722 friend class Item_sum_count;
723 friend class Item_sum_avg;
724 friend class Item_sum_std;
725 friend class Item_sum_min;
726 friend class Item_sum_max;
727 friend class Item_func_group_concat;
729 bool isReadSet()
const;
731 void setReadSet(
bool arg=
true);
732 void setWriteSet(
bool arg=
true);
736 void pack_num(uint64_t arg,
unsigned char *destination= NULL);
737 void pack_num(uint32_t arg,
unsigned char *destination= NULL);
738 uint64_t unpack_num(uint64_t &destination,
const unsigned char *arg= NULL)
const;
739 uint32_t unpack_num(uint32_t &destination,
const unsigned char *arg= NULL)
const;
744 inline bool isDateTime(
const enum_field_types &arg)
748 case DRIZZLE_TYPE_DATE:
749 case DRIZZLE_TYPE_DATETIME:
750 case DRIZZLE_TYPE_MICROTIME:
751 case DRIZZLE_TYPE_TIME:
752 case DRIZZLE_TYPE_TIMESTAMP:
755 case DRIZZLE_TYPE_BLOB:
756 case DRIZZLE_TYPE_BOOLEAN:
757 case DRIZZLE_TYPE_DECIMAL:
758 case DRIZZLE_TYPE_DOUBLE:
759 case DRIZZLE_TYPE_ENUM:
760 case DRIZZLE_TYPE_LONG:
761 case DRIZZLE_TYPE_LONGLONG:
762 case DRIZZLE_TYPE_NULL:
763 case DRIZZLE_TYPE_UUID:
764 case DRIZZLE_TYPE_IPV6:
765 case DRIZZLE_TYPE_VARCHAR:
775 std::ostream& operator<<(std::ostream& output,
const Field &field);
789 const char *table_name;
790 const char *org_table_name;
791 const char *col_name;
792 const char *org_col_name;
797 enum_field_types type;
800 uint32_t pack_length_to_packflag(uint32_t type);
801 uint32_t calc_pack_length(enum_field_types type,uint32_t length);
802 int set_field_to_null(
Field *field);