597
535
@returns 0 no bytes written.
599
virtual int do_save_field_metadata(unsigned char *metadata_ptr __attribute__((unused)))
537
virtual int do_save_field_metadata(uchar *metadata_ptr __attribute__((__unused__)))
542
class Field_num :public Field {
545
bool zerofill,unsigned_flag; // Purify cannot handle bit fields
546
Field_num(uchar *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
547
uchar null_bit_arg, utype unireg_check_arg,
548
const char *field_name_arg,
549
uint8 dec_arg, bool zero_arg, bool unsigned_arg);
550
Item_result result_type () const { return REAL_RESULT; }
551
void prepend_zeros(String *value);
552
void add_zerofill_and_unsigned(String &res) const;
553
friend class Create_field;
554
void make_field(Send_field *);
555
uint decimals() const { return (uint) dec; }
556
uint size_of() const { return sizeof(*this); }
557
bool eq_def(Field *field);
558
int store_decimal(const my_decimal *);
559
my_decimal *val_decimal(my_decimal *);
560
uint is_equal(Create_field *new_field);
561
int check_int(CHARSET_INFO *cs, const char *str, int length,
562
const char *int_end, int error);
563
bool get_int(CHARSET_INFO *cs, const char *from, uint len,
564
int64_t *rnd, uint64_t unsigned_max,
565
int64_t signed_min, int64_t signed_max);
569
class Field_str :public Field {
571
CHARSET_INFO *field_charset;
572
enum Derivation field_derivation;
574
Field_str(uchar *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
575
uchar null_bit_arg, utype unireg_check_arg,
576
const char *field_name_arg, CHARSET_INFO *charset);
577
Item_result result_type () const { return STRING_RESULT; }
578
uint decimals() const { return NOT_FIXED_DEC; }
579
int store(double nr);
580
int store(int64_t nr, bool unsigned_val)=0;
581
int store_decimal(const my_decimal *);
582
int store(const char *to,uint length,CHARSET_INFO *cs)=0;
583
uint size_of() const { return sizeof(*this); }
584
CHARSET_INFO *charset(void) const { return field_charset; }
585
void set_charset(CHARSET_INFO *charset_arg) { field_charset= charset_arg; }
586
enum Derivation derivation(void) const { return field_derivation; }
587
virtual void set_derivation(enum Derivation derivation_arg)
588
{ field_derivation= derivation_arg; }
589
bool binary() const { return field_charset == &my_charset_bin; }
590
uint32 max_display_length() { return field_length; }
591
friend class Create_field;
592
my_decimal *val_decimal(my_decimal *);
593
virtual bool str_needs_quotes() { return true; }
594
bool compare_str_field_flags(Create_field *new_field, uint32 flags);
595
uint is_equal(Create_field *new_field);
599
/* base class for Field_string, Field_varstring and Field_blob */
601
class Field_longstr :public Field_str
604
int report_if_important_data(const char *ptr, const char *end);
606
Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
607
uchar null_bit_arg, utype unireg_check_arg,
608
const char *field_name_arg, CHARSET_INFO *charset_arg)
609
:Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
610
field_name_arg, charset_arg)
613
int store_decimal(const my_decimal *d);
614
uint32 max_data_length() const;
617
/* base class for float and double and decimal (old one) */
618
class Field_real :public Field_num {
622
Field_real(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
623
uchar null_bit_arg, utype unireg_check_arg,
624
const char *field_name_arg,
625
uint8 dec_arg, bool zero_arg, bool unsigned_arg)
626
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
627
field_name_arg, dec_arg, zero_arg, unsigned_arg),
628
not_fixed(dec_arg >= NOT_FIXED_DEC)
630
int store_decimal(const my_decimal *);
631
my_decimal *val_decimal(my_decimal *);
632
int truncate(double *nr, double max_length);
633
uint32 max_display_length() { return field_length; }
634
uint size_of() const { return sizeof(*this); }
635
virtual const uchar *unpack(uchar* to, const uchar *from,
636
uint param_data, bool low_byte_first);
637
virtual uchar *pack(uchar* to, const uchar *from,
638
uint max_length, bool low_byte_first);
642
/* New decimal/numeric field which use fixed point arithmetic */
643
class Field_new_decimal :public Field_num {
645
int do_save_field_metadata(uchar *first_byte);
647
/* The maximum number of decimal digits can be stored */
651
Constructors take max_length of the field as a parameter - not the
652
precision as the number of decimal digits allowed.
653
So for example we need to count length from precision handling
654
CREATE TABLE ( DECIMAL(x,y))
656
Field_new_decimal(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
658
enum utype unireg_check_arg, const char *field_name_arg,
659
uint8 dec_arg, bool zero_arg, bool unsigned_arg);
660
Field_new_decimal(uint32 len_arg, bool maybe_null_arg,
661
const char *field_name_arg, uint8 dec_arg,
663
enum_field_types type() const { return MYSQL_TYPE_NEWDECIMAL;}
664
enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
665
Item_result result_type () const { return DECIMAL_RESULT; }
667
bool store_value(const my_decimal *decimal_value);
668
void set_value_on_overflow(my_decimal *decimal_value, bool sign);
669
int store(const char *to, uint length, CHARSET_INFO *charset);
670
int store(double nr);
671
int store(int64_t nr, bool unsigned_val);
672
int store_time(MYSQL_TIME *ltime, timestamp_type t_type);
673
int store_decimal(const my_decimal *);
674
double val_real(void);
675
int64_t val_int(void);
676
my_decimal *val_decimal(my_decimal *);
677
String *val_str(String*, String *);
678
int cmp(const uchar *, const uchar *);
679
void sort_string(uchar *buff, uint length);
680
bool zero_pack() const { return 0; }
681
void sql_type(String &str) const;
682
uint32 max_display_length() { return field_length; }
683
uint size_of() const { return sizeof(*this); }
684
uint32 pack_length() const { return (uint32) bin_size; }
685
uint pack_length_from_metadata(uint field_metadata);
686
uint row_pack_length() { return pack_length(); }
687
int compatible_field_size(uint field_metadata);
688
uint is_equal(Create_field *new_field);
689
virtual const uchar *unpack(uchar* to, const uchar *from,
690
uint param_data, bool low_byte_first);
694
class Field_tiny :public Field_num {
696
Field_tiny(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
698
enum utype unireg_check_arg, const char *field_name_arg,
699
bool zero_arg, bool unsigned_arg)
700
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
701
unireg_check_arg, field_name_arg,
702
0, zero_arg,unsigned_arg)
704
enum Item_result result_type () const { return INT_RESULT; }
705
enum_field_types type() const { return MYSQL_TYPE_TINY;}
706
enum ha_base_keytype key_type() const
707
{ return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
708
int store(const char *to,uint length,CHARSET_INFO *charset);
709
int store(double nr);
710
int store(int64_t nr, bool unsigned_val);
711
int reset(void) { ptr[0]=0; return 0; }
712
double val_real(void);
713
int64_t val_int(void);
714
String *val_str(String*,String *);
715
bool send_binary(Protocol *protocol);
716
int cmp(const uchar *,const uchar *);
717
void sort_string(uchar *buff,uint length);
718
uint32 pack_length() const { return 1; }
719
void sql_type(String &str) const;
720
uint32 max_display_length() { return 4; }
722
virtual uchar *pack(uchar* to, const uchar *from,
723
uint max_length __attribute__((__unused__)),
724
bool low_byte_first __attribute__((__unused__)))
730
virtual const uchar *unpack(uchar* to, const uchar *from,
731
uint param_data __attribute__((__unused__)),
732
bool low_byte_first __attribute__((__unused__)))
740
class Field_short :public Field_num {
742
Field_short(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
744
enum utype unireg_check_arg, const char *field_name_arg,
745
bool zero_arg, bool unsigned_arg)
746
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
747
unireg_check_arg, field_name_arg,
748
0, zero_arg,unsigned_arg)
750
Field_short(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
752
:Field_num((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
753
NONE, field_name_arg, 0, 0, unsigned_arg)
755
enum Item_result result_type () const { return INT_RESULT; }
756
enum_field_types type() const { return MYSQL_TYPE_SHORT;}
757
enum ha_base_keytype key_type() const
758
{ return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
759
int store(const char *to,uint length,CHARSET_INFO *charset);
760
int store(double nr);
761
int store(int64_t nr, bool unsigned_val);
762
int reset(void) { ptr[0]=ptr[1]=0; return 0; }
763
double val_real(void);
764
int64_t val_int(void);
765
String *val_str(String*,String *);
766
bool send_binary(Protocol *protocol);
767
int cmp(const uchar *,const uchar *);
768
void sort_string(uchar *buff,uint length);
769
uint32 pack_length() const { return 2; }
770
void sql_type(String &str) const;
771
uint32 max_display_length() { return 6; }
773
virtual uchar *pack(uchar* to, const uchar *from,
774
uint max_length __attribute__((__unused__)),
775
bool low_byte_first __attribute__((__unused__)))
778
#ifdef WORDS_BIGENDIAN
779
if (table->s->db_low_byte_first)
780
val = sint2korr(from);
785
#ifdef WORDS_BIGENDIAN
791
return to + sizeof(val);
794
virtual const uchar *unpack(uchar* to, const uchar *from,
795
uint param_data __attribute__((__unused__)),
796
bool low_byte_first __attribute__((__unused__)))
799
#ifdef WORDS_BIGENDIAN
801
val = sint2korr(from);
806
#ifdef WORDS_BIGENDIAN
807
if (table->s->db_low_byte_first)
812
return from + sizeof(val);
816
class Field_long :public Field_num {
818
Field_long(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
820
enum utype unireg_check_arg, const char *field_name_arg,
821
bool zero_arg, bool unsigned_arg)
822
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
823
unireg_check_arg, field_name_arg,
824
0, zero_arg,unsigned_arg)
826
Field_long(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
828
:Field_num((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
829
NONE, field_name_arg,0,0,unsigned_arg)
831
enum Item_result result_type () const { return INT_RESULT; }
832
enum_field_types type() const { return MYSQL_TYPE_LONG;}
833
enum ha_base_keytype key_type() const
834
{ return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
835
int store(const char *to,uint length,CHARSET_INFO *charset);
836
int store(double nr);
837
int store(int64_t nr, bool unsigned_val);
838
int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
839
double val_real(void);
840
int64_t val_int(void);
841
bool send_binary(Protocol *protocol);
842
String *val_str(String*,String *);
843
int cmp(const uchar *,const uchar *);
844
void sort_string(uchar *buff,uint length);
845
uint32 pack_length() const { return 4; }
846
void sql_type(String &str) const;
847
uint32 max_display_length() { return MY_INT32_NUM_DECIMAL_DIGITS; }
848
virtual uchar *pack(uchar* to, const uchar *from,
849
uint max_length __attribute__((__unused__)),
850
bool low_byte_first __attribute__((__unused__)))
853
#ifdef WORDS_BIGENDIAN
854
if (table->s->db_low_byte_first)
855
val = sint4korr(from);
860
#ifdef WORDS_BIGENDIAN
866
return to + sizeof(val);
869
virtual const uchar *unpack(uchar* to, const uchar *from,
870
uint param_data __attribute__((__unused__)),
871
bool low_byte_first __attribute__((__unused__)))
874
#ifdef WORDS_BIGENDIAN
876
val = sint4korr(from);
881
#ifdef WORDS_BIGENDIAN
882
if (table->s->db_low_byte_first)
887
return from + sizeof(val);
892
class Field_int64_t :public Field_num {
894
Field_int64_t(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
896
enum utype unireg_check_arg, const char *field_name_arg,
897
bool zero_arg, bool unsigned_arg)
898
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
899
unireg_check_arg, field_name_arg,
900
0, zero_arg,unsigned_arg)
902
Field_int64_t(uint32 len_arg,bool maybe_null_arg,
903
const char *field_name_arg,
905
:Field_num((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
906
NONE, field_name_arg,0,0,unsigned_arg)
908
enum Item_result result_type () const { return INT_RESULT; }
909
enum_field_types type() const { return MYSQL_TYPE_LONGLONG;}
910
enum ha_base_keytype key_type() const
911
{ return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
912
int store(const char *to,uint length,CHARSET_INFO *charset);
913
int store(double nr);
914
int store(int64_t nr, bool unsigned_val);
917
ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
920
double val_real(void);
921
int64_t val_int(void);
922
String *val_str(String*,String *);
923
bool send_binary(Protocol *protocol);
924
int cmp(const uchar *,const uchar *);
925
void sort_string(uchar *buff,uint length);
926
uint32 pack_length() const { return 8; }
927
void sql_type(String &str) const;
928
bool can_be_compared_as_int64_t() const { return true; }
929
uint32 max_display_length() { return 20; }
930
virtual uchar *pack(uchar* to, const uchar *from,
931
uint max_length __attribute__((__unused__)),
932
bool low_byte_first __attribute__((__unused__)))
935
#ifdef WORDS_BIGENDIAN
936
if (table->s->db_low_byte_first)
937
val = sint8korr(from);
940
int64_tget(val, from);
942
#ifdef WORDS_BIGENDIAN
947
int64_tstore(to, val);
948
return to + sizeof(val);
951
virtual const uchar *unpack(uchar* to, const uchar *from,
952
uint param_data __attribute__((__unused__)),
953
bool low_byte_first __attribute__((__unused__)))
956
#ifdef WORDS_BIGENDIAN
958
val = sint8korr(from);
961
int64_tget(val, from);
963
#ifdef WORDS_BIGENDIAN
964
if (table->s->db_low_byte_first)
968
int64_tstore(to, val);
969
return from + sizeof(val);
973
class Field_float :public Field_real {
975
Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
977
enum utype unireg_check_arg, const char *field_name_arg,
978
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
979
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
980
unireg_check_arg, field_name_arg,
981
dec_arg, zero_arg, unsigned_arg)
983
Field_float(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
985
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
986
NONE, field_name_arg, dec_arg, 0, 0)
988
enum_field_types type() const { return MYSQL_TYPE_FLOAT;}
989
enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
990
int store(const char *to,uint length,CHARSET_INFO *charset);
991
int store(double nr);
992
int store(int64_t nr, bool unsigned_val);
993
int reset(void) { bzero(ptr,sizeof(float)); return 0; }
994
double val_real(void);
995
int64_t val_int(void);
996
String *val_str(String*,String *);
997
bool send_binary(Protocol *protocol);
998
int cmp(const uchar *,const uchar *);
999
void sort_string(uchar *buff,uint length);
1000
uint32 pack_length() const { return sizeof(float); }
1001
uint row_pack_length() { return pack_length(); }
1002
void sql_type(String &str) const;
1004
int do_save_field_metadata(uchar *first_byte);
1008
class Field_double :public Field_real {
1010
Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1012
enum utype unireg_check_arg, const char *field_name_arg,
1013
uint8 dec_arg,bool zero_arg,bool unsigned_arg)
1014
:Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1015
unireg_check_arg, field_name_arg,
1016
dec_arg, zero_arg, unsigned_arg)
1018
Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
1020
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
1021
NONE, field_name_arg, dec_arg, 0, 0)
1023
Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
1024
uint8 dec_arg, my_bool not_fixed_arg)
1025
:Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0,
1026
NONE, field_name_arg, dec_arg, 0, 0)
1027
{not_fixed= not_fixed_arg; }
1028
enum_field_types type() const { return MYSQL_TYPE_DOUBLE;}
1029
enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }
1030
int store(const char *to,uint length,CHARSET_INFO *charset);
1031
int store(double nr);
1032
int store(int64_t nr, bool unsigned_val);
1033
int reset(void) { bzero(ptr,sizeof(double)); return 0; }
1034
double val_real(void);
1035
int64_t val_int(void);
1036
String *val_str(String*,String *);
1037
bool send_binary(Protocol *protocol);
1038
int cmp(const uchar *,const uchar *);
1039
void sort_string(uchar *buff,uint length);
1040
uint32 pack_length() const { return sizeof(double); }
1041
uint row_pack_length() { return pack_length(); }
1042
void sql_type(String &str) const;
1044
int do_save_field_metadata(uchar *first_byte);
1048
/* Everything saved in this will disappear. It will always return NULL */
1050
class Field_null :public Field_str {
1051
static uchar null[1];
1053
Field_null(uchar *ptr_arg, uint32 len_arg,
1054
enum utype unireg_check_arg, const char *field_name_arg,
1056
:Field_str(ptr_arg, len_arg, null, 1,
1057
unireg_check_arg, field_name_arg, cs)
1059
enum_field_types type() const { return MYSQL_TYPE_NULL;}
1060
int store(const char *to __attribute__((__unused__)),
1061
uint length __attribute__((__unused__)),
1062
CHARSET_INFO *cs __attribute__((__unused__)))
1063
{ null[0]=1; return 0; }
1064
int store(double nr __attribute__((__unused__)))
1065
{ null[0]=1; return 0; }
1066
int store(int64_t nr __attribute__((__unused__)),
1067
bool unsigned_val __attribute__((__unused__)))
1068
{ null[0]=1; return 0; }
1069
int store_decimal(const my_decimal *d __attribute__((__unused__)))
1070
{ null[0]=1; return 0; }
1073
double val_real(void)
1075
int64_t val_int(void)
1077
my_decimal *val_decimal(my_decimal *) { return 0; }
1078
String *val_str(String *value __attribute__((__unused__)),
1080
{ value2->length(0); return value2;}
1081
int cmp(const uchar *a __attribute__((__unused__)),
1082
const uchar *b __attribute__((__unused__))) { return 0;}
1083
void sort_string(uchar *buff __attribute__((__unused__)),
1084
uint length __attribute__((__unused__))) {}
1085
uint32 pack_length() const { return 0; }
1086
void sql_type(String &str) const;
1087
uint size_of() const { return sizeof(*this); }
1088
uint32 max_display_length() { return 4; }
1092
class Field_timestamp :public Field_str {
1094
Field_timestamp(uchar *ptr_arg, uint32 len_arg,
1095
uchar *null_ptr_arg, uchar null_bit_arg,
1096
enum utype unireg_check_arg, const char *field_name_arg,
1097
TABLE_SHARE *share, CHARSET_INFO *cs);
1098
Field_timestamp(bool maybe_null_arg, const char *field_name_arg,
1100
enum_field_types type() const { return MYSQL_TYPE_TIMESTAMP;}
1101
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
1102
enum Item_result cmp_type () const { return INT_RESULT; }
1103
int store(const char *to,uint length,CHARSET_INFO *charset);
1104
int store(double nr);
1105
int store(int64_t nr, bool unsigned_val);
1106
int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
1107
double val_real(void);
1108
int64_t val_int(void);
1109
String *val_str(String*,String *);
1110
bool send_binary(Protocol *protocol);
1111
int cmp(const uchar *,const uchar *);
1112
void sort_string(uchar *buff,uint length);
1113
uint32 pack_length() const { return 4; }
1114
void sql_type(String &str) const;
1115
bool can_be_compared_as_int64_t() const { return true; }
1116
bool zero_pack() const { return 0; }
1118
virtual void set_default()
1120
if (table->timestamp_field == this &&
1121
unireg_check != TIMESTAMP_UN_FIELD)
1124
Field::set_default();
1126
/* Get TIMESTAMP field value as seconds since begging of Unix Epoch */
1127
inline long get_timestamp(my_bool *null_value)
1129
if ((*null_value= is_null()))
1131
#ifdef WORDS_BIGENDIAN
1132
if (table && table->s->db_low_byte_first)
1133
return sint4korr(ptr);
1139
inline void store_timestamp(my_time_t timestamp)
1141
#ifdef WORDS_BIGENDIAN
1142
if (table && table->s->db_low_byte_first)
1144
int4store(ptr,timestamp);
1148
longstore(ptr,(uint32) timestamp);
1150
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
1151
bool get_time(MYSQL_TIME *ltime);
1152
timestamp_auto_set_type get_auto_set_type() const;
1156
class Field_year :public Field_tiny {
1158
Field_year(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1160
enum utype unireg_check_arg, const char *field_name_arg)
1161
:Field_tiny(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1162
unireg_check_arg, field_name_arg, 1, 1)
1164
enum_field_types type() const { return MYSQL_TYPE_YEAR;}
1165
int store(const char *to,uint length,CHARSET_INFO *charset);
1166
int store(double nr);
1167
int store(int64_t nr, bool unsigned_val);
1168
double val_real(void);
1169
int64_t val_int(void);
1170
String *val_str(String*,String *);
1171
bool send_binary(Protocol *protocol);
1172
void sql_type(String &str) const;
1173
bool can_be_compared_as_int64_t() const { return true; }
1177
class Field_newdate :public Field_str {
1179
Field_newdate(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
1180
enum utype unireg_check_arg, const char *field_name_arg,
1182
:Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
1183
unireg_check_arg, field_name_arg, cs)
1185
Field_newdate(bool maybe_null_arg, const char *field_name_arg,
1187
:Field_str((uchar*) 0,10, maybe_null_arg ? (uchar*) "": 0,0,
1188
NONE, field_name_arg, cs) {}
1189
enum_field_types type() const { return MYSQL_TYPE_NEWDATE;}
1190
enum_field_types real_type() const { return MYSQL_TYPE_NEWDATE; }
1191
enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; }
1192
enum Item_result cmp_type () const { return INT_RESULT; }
1193
int store(const char *to,uint length,CHARSET_INFO *charset);
1194
int store(double nr);
1195
int store(int64_t nr, bool unsigned_val);
1196
int store_time(MYSQL_TIME *ltime, timestamp_type type);
1197
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
1198
double val_real(void);
1199
int64_t val_int(void);
1200
String *val_str(String*,String *);
1201
bool send_binary(Protocol *protocol);
1202
int cmp(const uchar *,const uchar *);
1203
void sort_string(uchar *buff,uint length);
1204
uint32 pack_length() const { return 3; }
1205
void sql_type(String &str) const;
1206
bool can_be_compared_as_int64_t() const { return true; }
1207
bool zero_pack() const { return 1; }
1208
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
1209
bool get_time(MYSQL_TIME *ltime);
1213
class Field_time :public Field_str {
1215
Field_time(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
1216
enum utype unireg_check_arg, const char *field_name_arg,
1218
:Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg,
1219
unireg_check_arg, field_name_arg, cs)
1221
Field_time(bool maybe_null_arg, const char *field_name_arg,
1223
:Field_str((uchar*) 0,8, maybe_null_arg ? (uchar*) "": 0,0,
1224
NONE, field_name_arg, cs) {}
1225
enum_field_types type() const { return MYSQL_TYPE_TIME;}
1226
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
1227
enum Item_result cmp_type () const { return INT_RESULT; }
1228
int store_time(MYSQL_TIME *ltime, timestamp_type type);
1229
int store(const char *to,uint length,CHARSET_INFO *charset);
1230
int store(double nr);
1231
int store(int64_t nr, bool unsigned_val);
1232
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
1233
double val_real(void);
1234
int64_t val_int(void);
1235
String *val_str(String*,String *);
1236
bool get_date(MYSQL_TIME *ltime, uint fuzzydate);
1237
bool send_binary(Protocol *protocol);
1238
bool get_time(MYSQL_TIME *ltime);
1239
int cmp(const uchar *,const uchar *);
1240
void sort_string(uchar *buff,uint length);
1241
uint32 pack_length() const { return 3; }
1242
void sql_type(String &str) const;
1243
bool can_be_compared_as_int64_t() const { return true; }
1244
bool zero_pack() const { return 1; }
1248
class Field_datetime :public Field_str {
1250
Field_datetime(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
1251
enum utype unireg_check_arg, const char *field_name_arg,
1253
:Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
1254
unireg_check_arg, field_name_arg, cs)
1256
Field_datetime(bool maybe_null_arg, const char *field_name_arg,
1258
:Field_str((uchar*) 0,19, maybe_null_arg ? (uchar*) "": 0,0,
1259
NONE, field_name_arg, cs) {}
1260
enum_field_types type() const { return MYSQL_TYPE_DATETIME;}
1261
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
1262
enum Item_result cmp_type () const { return INT_RESULT; }
1263
uint decimals() const { return DATETIME_DEC; }
1264
int store(const char *to,uint length,CHARSET_INFO *charset);
1265
int store(double nr);
1266
int store(int64_t nr, bool unsigned_val);
1267
int store_time(MYSQL_TIME *ltime, timestamp_type type);
1270
ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
1273
double val_real(void);
1274
int64_t val_int(void);
1275
String *val_str(String*,String *);
1276
bool send_binary(Protocol *protocol);
1277
int cmp(const uchar *,const uchar *);
1278
void sort_string(uchar *buff,uint length);
1279
uint32 pack_length() const { return 8; }
1280
void sql_type(String &str) const;
1281
bool can_be_compared_as_int64_t() const { return true; }
1282
bool zero_pack() const { return 1; }
1283
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
1284
bool get_time(MYSQL_TIME *ltime);
1288
class Field_string :public Field_longstr {
1290
bool can_alter_field_type;
1291
Field_string(uchar *ptr_arg, uint32 len_arg,uchar *null_ptr_arg,
1293
enum utype unireg_check_arg, const char *field_name_arg,
1295
:Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1296
unireg_check_arg, field_name_arg, cs),
1297
can_alter_field_type(1) {};
1298
Field_string(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
1300
:Field_longstr((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, 0,
1301
NONE, field_name_arg, cs),
1302
can_alter_field_type(1) {};
1304
enum_field_types type() const
1306
return MYSQL_TYPE_STRING;
1308
enum ha_base_keytype key_type() const
1309
{ return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
1310
bool zero_pack() const { return 0; }
1313
charset()->cset->fill(charset(),(char*) ptr, field_length,
1314
(has_charset() ? ' ' : 0));
1317
int store(const char *to,uint length,CHARSET_INFO *charset);
1318
int store(int64_t nr, bool unsigned_val);
1319
int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */
1320
double val_real(void);
1321
int64_t val_int(void);
1322
String *val_str(String*,String *);
1323
my_decimal *val_decimal(my_decimal *);
1324
int cmp(const uchar *,const uchar *);
1325
void sort_string(uchar *buff,uint length);
1326
void sql_type(String &str) const;
1327
virtual uchar *pack(uchar *to, const uchar *from,
1328
uint max_length, bool low_byte_first);
1329
virtual const uchar *unpack(uchar* to, const uchar *from,
1330
uint param_data, bool low_byte_first);
1331
uint pack_length_from_metadata(uint field_metadata)
1332
{ return (field_metadata & 0x00ff); }
1333
uint row_pack_length() { return (field_length + 1); }
1334
int pack_cmp(const uchar *a,const uchar *b,uint key_length,
1335
my_bool insert_or_update);
1336
int pack_cmp(const uchar *b,uint key_length,my_bool insert_or_update);
1337
uint packed_col_length(const uchar *to, uint length);
1338
uint max_packed_col_length(uint max_length);
1339
uint size_of() const { return sizeof(*this); }
1340
enum_field_types real_type() const { return MYSQL_TYPE_STRING; }
1341
bool has_charset(void) const
1342
{ return charset() == &my_charset_bin ? false : true; }
1343
Field *new_field(MEM_ROOT *root, struct st_table *new_table, bool keep_type);
1344
virtual uint get_key_image(uchar *buff,uint length, imagetype type);
1346
int do_save_field_metadata(uchar *first_byte);
1350
class Field_varstring :public Field_longstr {
1353
The maximum space available in a Field_varstring, in bytes. See
1356
static const uint MAX_SIZE;
1357
/* Store number of bytes used to store length (1 or 2) */
1358
uint32 length_bytes;
1359
Field_varstring(uchar *ptr_arg,
1360
uint32 len_arg, uint length_bytes_arg,
1361
uchar *null_ptr_arg, uchar null_bit_arg,
1362
enum utype unireg_check_arg, const char *field_name_arg,
1363
TABLE_SHARE *share, CHARSET_INFO *cs)
1364
:Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1365
unireg_check_arg, field_name_arg, cs),
1366
length_bytes(length_bytes_arg)
1368
share->varchar_fields++;
1370
Field_varstring(uint32 len_arg,bool maybe_null_arg,
1371
const char *field_name_arg,
1372
TABLE_SHARE *share, CHARSET_INFO *cs)
1373
:Field_longstr((uchar*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0, 0,
1374
NONE, field_name_arg, cs),
1375
length_bytes(len_arg < 256 ? 1 :2)
1377
share->varchar_fields++;
1380
enum_field_types type() const { return MYSQL_TYPE_VARCHAR; }
1381
enum ha_base_keytype key_type() const;
1382
uint row_pack_length() { return field_length; }
1383
bool zero_pack() const { return 0; }
1384
int reset(void) { bzero(ptr,field_length+length_bytes); return 0; }
1385
uint32 pack_length() const { return (uint32) field_length+length_bytes; }
1386
uint32 key_length() const { return (uint32) field_length; }
1387
uint32 sort_length() const
1389
return (uint32) field_length + (field_charset == &my_charset_bin ?
1392
int store(const char *to,uint length,CHARSET_INFO *charset);
1393
int store(int64_t nr, bool unsigned_val);
1394
int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */
1395
double val_real(void);
1396
int64_t val_int(void);
1397
String *val_str(String*,String *);
1398
my_decimal *val_decimal(my_decimal *);
1399
int cmp_max(const uchar *, const uchar *, uint max_length);
1400
int cmp(const uchar *a,const uchar *b)
1402
return cmp_max(a, b, ~0L);
1404
void sort_string(uchar *buff,uint length);
1405
uint get_key_image(uchar *buff,uint length, imagetype type);
1406
void set_key_image(const uchar *buff,uint length);
1407
void sql_type(String &str) const;
1408
virtual uchar *pack(uchar *to, const uchar *from,
1409
uint max_length, bool low_byte_first);
1410
uchar *pack_key(uchar *to, const uchar *from, uint max_length, bool low_byte_first);
1411
uchar *pack_key_from_key_image(uchar* to, const uchar *from,
1412
uint max_length, bool low_byte_first);
1413
virtual const uchar *unpack(uchar* to, const uchar *from,
1414
uint param_data, bool low_byte_first);
1415
const uchar *unpack_key(uchar* to, const uchar *from,
1416
uint max_length, bool low_byte_first);
1417
int pack_cmp(const uchar *a, const uchar *b, uint key_length,
1418
my_bool insert_or_update);
1419
int pack_cmp(const uchar *b, uint key_length,my_bool insert_or_update);
1420
int cmp_binary(const uchar *a,const uchar *b, uint32 max_length=~0L);
1421
int key_cmp(const uchar *,const uchar*);
1422
int key_cmp(const uchar *str, uint length);
1423
uint packed_col_length(const uchar *to, uint length);
1424
uint max_packed_col_length(uint max_length);
1425
uint32 data_length();
1426
uint32 used_length();
1427
uint size_of() const { return sizeof(*this); }
1428
enum_field_types real_type() const { return MYSQL_TYPE_VARCHAR; }
1429
bool has_charset(void) const
1430
{ return charset() == &my_charset_bin ? false : true; }
1431
Field *new_field(MEM_ROOT *root, struct st_table *new_table, bool keep_type);
1432
Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
1433
uchar *new_ptr, uchar *new_null_ptr,
1435
uint is_equal(Create_field *new_field);
1436
void hash(ulong *nr, ulong *nr2);
1438
int do_save_field_metadata(uchar *first_byte);
1442
class Field_blob :public Field_longstr {
1445
String value; // For temporaries
1447
Field_blob(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg,
1448
enum utype unireg_check_arg, const char *field_name_arg,
1449
TABLE_SHARE *share, uint blob_pack_length, CHARSET_INFO *cs);
1450
Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
1452
:Field_longstr((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, 0,
1453
NONE, field_name_arg, cs),
1458
Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
1459
CHARSET_INFO *cs, bool set_packlength)
1460
:Field_longstr((uchar*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0, 0,
1461
NONE, field_name_arg, cs)
1467
uint32 l_char_length= len_arg/cs->mbmaxlen;
1468
packlength= l_char_length <= 255 ? 1 :
1469
l_char_length <= 65535 ? 2 :
1470
l_char_length <= 16777215 ? 3 : 4;
1473
Field_blob(uint32 packlength_arg)
1474
:Field_longstr((uchar*) 0, 0, (uchar*) "", 0, NONE, "temp", system_charset_info),
1475
packlength(packlength_arg) {}
1476
enum_field_types type() const { return MYSQL_TYPE_BLOB;}
1477
enum ha_base_keytype key_type() const
1478
{ return binary() ? HA_KEYTYPE_VARBINARY2 : HA_KEYTYPE_VARTEXT2; }
1479
int store(const char *to,uint length,CHARSET_INFO *charset);
1480
int store(double nr);
1481
int store(int64_t nr, bool unsigned_val);
1482
double val_real(void);
1483
int64_t val_int(void);
1484
String *val_str(String*,String *);
1485
my_decimal *val_decimal(my_decimal *);
1486
int cmp_max(const uchar *, const uchar *, uint max_length);
1487
int cmp(const uchar *a,const uchar *b)
1488
{ return cmp_max(a, b, ~0L); }
1489
int cmp(const uchar *a, uint32 a_length, const uchar *b, uint32 b_length);
1490
int cmp_binary(const uchar *a,const uchar *b, uint32 max_length=~0L);
1491
int key_cmp(const uchar *,const uchar*);
1492
int key_cmp(const uchar *str, uint length);
1493
uint32 key_length() const { return 0; }
1494
void sort_string(uchar *buff,uint length);
1495
uint32 pack_length() const
1496
{ return (uint32) (packlength+table->s->blob_ptr_size); }
1499
Return the packed length without the pointer size added.
1501
This is used to determine the size of the actual data in the row
1504
@returns The length of the raw data itself without the pointer.
1506
uint32 pack_length_no_ptr() const
1507
{ return (uint32) (packlength); }
1508
uint row_pack_length() { return pack_length_no_ptr(); }
1509
uint32 sort_length() const;
1510
virtual uint32 max_data_length() const
1512
return (uint32) (((uint64_t) 1 << (packlength*8)) -1);
1514
int reset(void) { bzero(ptr, packlength+sizeof(uchar*)); return 0; }
1515
void reset_fields() { bzero((uchar*) &value,sizeof(value)); }
1516
#ifndef WORDS_BIGENDIAN
1519
void store_length(uchar *i_ptr, uint i_packlength, uint32 i_number, bool low_byte_first);
1520
void store_length(uchar *i_ptr, uint i_packlength, uint32 i_number)
1522
store_length(i_ptr, i_packlength, i_number, table->s->db_low_byte_first);
1524
inline void store_length(uint32 number)
1526
store_length(ptr, packlength, number);
1530
Return the packed length plus the length of the data.
1532
This is used to determine the size of the data plus the
1533
packed length portion in the row data.
1535
@returns The length in the row plus the size of the data.
1537
uint32 get_packed_size(const uchar *ptr_arg, bool low_byte_first)
1538
{return packlength + get_length(ptr_arg, packlength, low_byte_first);}
1540
inline uint32 get_length(uint row_offset= 0)
1541
{ return get_length(ptr+row_offset, this->packlength, table->s->db_low_byte_first); }
1542
uint32 get_length(const uchar *ptr, uint packlength, bool low_byte_first);
1543
uint32 get_length(const uchar *ptr_arg)
1544
{ return get_length(ptr_arg, this->packlength, table->s->db_low_byte_first); }
1545
void put_length(uchar *pos, uint32 length);
1546
inline void get_ptr(uchar **str)
1548
memcpy_fixed((uchar*) str,ptr+packlength,sizeof(uchar*));
1550
inline void get_ptr(uchar **str, uint row_offset)
1552
memcpy_fixed((uchar*) str,ptr+packlength+row_offset,sizeof(char*));
1554
inline void set_ptr(uchar *length, uchar *data)
1556
memcpy(ptr,length,packlength);
1557
memcpy_fixed(ptr+packlength,&data,sizeof(char*));
1559
void set_ptr_offset(my_ptrdiff_t ptr_diff, uint32 length, uchar *data)
1561
uchar *ptr_ofs= ADD_TO_PTR(ptr,ptr_diff,uchar*);
1562
store_length(ptr_ofs, packlength, length);
1563
memcpy_fixed(ptr_ofs+packlength,&data,sizeof(char*));
1565
inline void set_ptr(uint32 length, uchar *data)
1567
set_ptr_offset(0, length, data);
1569
uint get_key_image(uchar *buff,uint length, imagetype type);
1570
void set_key_image(const uchar *buff,uint length);
1571
void sql_type(String &str) const;
1576
if (value.copy((char*) tmp, get_length(), charset()))
1578
Field_blob::reset();
1581
tmp=(uchar*) value.ptr();
1582
memcpy_fixed(ptr+packlength,&tmp,sizeof(char*));
1585
virtual uchar *pack(uchar *to, const uchar *from,
1586
uint max_length, bool low_byte_first);
1587
uchar *pack_key(uchar *to, const uchar *from,
1588
uint max_length, bool low_byte_first);
1589
uchar *pack_key_from_key_image(uchar* to, const uchar *from,
1590
uint max_length, bool low_byte_first);
1591
virtual const uchar *unpack(uchar *to, const uchar *from,
1592
uint param_data, bool low_byte_first);
1593
const uchar *unpack_key(uchar* to, const uchar *from,
1594
uint max_length, bool low_byte_first);
1595
int pack_cmp(const uchar *a, const uchar *b, uint key_length,
1596
my_bool insert_or_update);
1597
int pack_cmp(const uchar *b, uint key_length,my_bool insert_or_update);
1598
uint packed_col_length(const uchar *col_ptr, uint length);
1599
uint max_packed_col_length(uint max_length);
1600
void free() { value.free(); }
1601
inline void clear_temporary() { bzero((uchar*) &value,sizeof(value)); }
1602
friend int field_conv(Field *to,Field *from);
1603
uint size_of() const { return sizeof(*this); }
1604
bool has_charset(void) const
1605
{ return charset() == &my_charset_bin ? false : true; }
1606
uint32 max_display_length();
1607
uint is_equal(Create_field *new_field);
1608
inline bool in_read_set() { return bitmap_is_set(table->read_set, field_index); }
1609
inline bool in_write_set() { return bitmap_is_set(table->write_set, field_index); }
1611
int do_save_field_metadata(uchar *first_byte);
1615
class Field_enum :public Field_str {
1620
Field_enum(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1622
enum utype unireg_check_arg, const char *field_name_arg,
1623
uint packlength_arg,
1624
TYPELIB *typelib_arg,
1625
CHARSET_INFO *charset_arg)
1626
:Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1627
unireg_check_arg, field_name_arg, charset_arg),
1628
packlength(packlength_arg),typelib(typelib_arg)
1632
Field *new_field(MEM_ROOT *root, struct st_table *new_table, bool keep_type);
1633
enum_field_types type() const { return MYSQL_TYPE_STRING; }
1634
enum Item_result cmp_type () const { return INT_RESULT; }
1635
enum Item_result cast_to_int_type () const { return INT_RESULT; }
1636
enum ha_base_keytype key_type() const;
1637
int store(const char *to,uint length,CHARSET_INFO *charset);
1638
int store(double nr);
1639
int store(int64_t nr, bool unsigned_val);
1640
double val_real(void);
1641
int64_t val_int(void);
1642
String *val_str(String*,String *);
1643
int cmp(const uchar *,const uchar *);
1644
void sort_string(uchar *buff,uint length);
1645
uint32 pack_length() const { return (uint32) packlength; }
1646
void store_type(uint64_t value);
1647
void sql_type(String &str) const;
1648
uint size_of() const { return sizeof(*this); }
1649
enum_field_types real_type() const { return MYSQL_TYPE_ENUM; }
1650
uint pack_length_from_metadata(uint field_metadata)
1651
{ return (field_metadata & 0x00ff); }
1652
uint row_pack_length() { return pack_length(); }
1653
virtual bool zero_pack() const { return 0; }
1654
bool optimize_range(uint idx __attribute__((__unused__)),
1655
uint part __attribute__((__unused__)))
1657
bool eq_def(Field *field);
1658
bool has_charset(void) const { return true; }
1659
/* enum and set are sorted as integers */
1660
CHARSET_INFO *sort_charset(void) const { return &my_charset_bin; }
1662
int do_save_field_metadata(uchar *first_byte);
1666
class Field_set :public Field_enum {
1668
Field_set(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
1670
enum utype unireg_check_arg, const char *field_name_arg,
1671
uint32 packlength_arg,
1672
TYPELIB *typelib_arg, CHARSET_INFO *charset_arg)
1673
:Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
1674
unireg_check_arg, field_name_arg,
1676
typelib_arg,charset_arg)
1678
flags=(flags & ~ENUM_FLAG) | SET_FLAG;
1680
int store(const char *to,uint length,CHARSET_INFO *charset);
1681
int store(double nr) { return Field_set::store((int64_t) nr, false); }
1682
int store(int64_t nr, bool unsigned_val);
1684
virtual bool zero_pack() const { return 1; }
1685
String *val_str(String*,String *);
1686
void sql_type(String &str) const;
1687
enum_field_types real_type() const { return MYSQL_TYPE_SET; }
1688
bool has_charset(void) const { return true; }
604
1693
Create field class for CREATE TABLE