field.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:38k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /*
  17. ** Because of the function new_field all field classes that have static
  18. ** variables must declare the size_of() member function.
  19. */
  20. #ifdef __GNUC__
  21. #pragma interface /* gcc class implementation */
  22. #endif
  23. #define NOT_FIXED_DEC 31
  24. class Send_field;
  25. struct st_cache_field;
  26. void field_conv(Field *to,Field *from);
  27. class Field {
  28.   Field(const Item &); /* Prevent use of theese */
  29.   void operator=(Field &);
  30. public:
  31.   static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); }
  32.   static void operator delete(void *ptr_arg, size_t size) {} /*lint -e715 */
  33.   enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
  34.        CHECK,EMPTY,UNKNOWN,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,BIT_FIELD,
  35.        TIMESTAMP_FIELD,CAPITALIZE,BLOB_FIELD};
  36.   char *ptr; // Position to field in record
  37.   uchar *null_ptr; // Byte where null_bit is
  38.   uint8 null_bit; // And position to it
  39.   struct st_table *table; // Pointer for table
  40.   ulong query_id; // For quick test of used fields
  41.   key_map key_start,part_of_key,part_of_sortkey;// Field is part of these keys.
  42.   const char *table_name,*field_name;
  43.   utype unireg_check;
  44.   uint32 field_length; // Length of field
  45.   uint16 flags;
  46.   Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,uint null_bit_arg,
  47. utype unireg_check_arg, const char *field_name_arg,
  48. struct st_table *table_arg);
  49.   virtual ~Field() {}
  50.   virtual void store(const char *to,uint length)=0;
  51.   virtual void store(double nr)=0;
  52.   virtual void store(longlong nr)=0;
  53.   virtual void store_time(TIME *ltime,timestamp_type t_type);
  54.   virtual double val_real(void)=0;
  55.   virtual longlong val_int(void)=0;
  56.   virtual String *val_str(String*,String *)=0;
  57.   virtual Item_result result_type () const=0;
  58.   virtual Item_result cmp_type () const { return result_type(); }
  59.   bool eq(Field *field) { return ptr == field->ptr; }
  60.   virtual bool eq_def(Field *field);
  61.   virtual uint32 pack_length() const { return (uint32) field_length; }
  62.   virtual void reset(void) { bzero(ptr,pack_length()); }
  63.   virtual void reset_fields() {}
  64.   virtual bool binary() const { return 1; }
  65.   virtual bool zero_pack() const { return 1; }
  66.   virtual enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
  67.   virtual uint32 key_length() const { return pack_length(); }
  68.   virtual enum_field_types type() const =0;
  69.   virtual enum_field_types real_type() const { return type(); }
  70.   inline  int cmp(const char *str) { return cmp(ptr,str); }
  71.   virtual int cmp(const char *,const char *)=0;
  72.   virtual int cmp_binary(const char *a,const char *b, ulong max_length=~0L)
  73.   { return memcmp(a,b,pack_length()); }
  74.   virtual int cmp_offset(uint row_offset)
  75.   { return memcmp(ptr,ptr+row_offset,pack_length()); }
  76.   virtual int cmp_binary_offset(uint row_offset)
  77.   { return memcmp(ptr,ptr+row_offset,pack_length()); }
  78.   virtual int key_cmp(const byte *a,const byte *b)
  79.   { return cmp((char*) a,(char*) b); }
  80.   virtual int key_cmp(const byte *str, uint length)
  81.   { return cmp(ptr,(char*) str); }
  82.   virtual uint decimals() const { return 0; }
  83.   virtual void sql_type(String &str) const =0;
  84.   // Caller beware: sql_type can change str.Ptr, so check
  85.   // ptr() to see if it changed if you are using your own buffer
  86.   // in str and restore it with set() if needed
  87.   
  88.   virtual uint size_of() const =0; // For new field
  89.   inline bool is_null(uint row_offset=0)
  90.   { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : table->null_row; }
  91.   inline bool is_real_null(uint row_offset=0)
  92.     { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; }
  93.   inline void set_null(int row_offset=0)
  94.     { if (null_ptr) null_ptr[row_offset]|= null_bit; }
  95.   inline void set_notnull(int row_offset=0)
  96.     { if (null_ptr) null_ptr[row_offset]&= ~null_bit; }
  97.   inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; }
  98.   inline bool real_maybe_null(void) { return null_ptr != 0; }
  99.   virtual void make_field(Send_field *)=0;
  100.   virtual void sort_string(char *buff,uint length)=0;
  101.   virtual bool optimize_range();
  102.   virtual bool store_for_compare() { return 0; }
  103.   inline Field *new_field(struct st_table *new_table)
  104.     {
  105.       Field *tmp= (Field*) sql_memdup((char*) this,size_of());
  106.       if (tmp)
  107.       {
  108. tmp->table=new_table;
  109. tmp->key_start=tmp->part_of_key=tmp->part_of_sortkey=0;
  110. tmp->unireg_check=Field::NONE;
  111. tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG | ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG);
  112. tmp->reset_fields();
  113.       }
  114.       return tmp;
  115.     }
  116.   inline void move_field(char *ptr_arg,uchar *null_ptr_arg,uint null_bit_arg)
  117.     {
  118.       ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
  119.     }
  120.   inline void move_field(char *ptr_arg) { ptr=ptr_arg; }
  121.   inline void move_field(my_ptrdiff_t ptr_diff)
  122.   {
  123.     ptr=ADD_TO_PTR(ptr,ptr_diff,char*);
  124.     if (null_ptr)
  125.       null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*);
  126.   }
  127.   inline void get_image(char *buff,uint length)
  128.     { memcpy(buff,ptr,length); }
  129.   inline void set_image(char *buff,uint length)
  130.     { memcpy(ptr,buff,length); }
  131.   virtual void get_key_image(char *buff,uint length)
  132.     { get_image(buff,length); }
  133.   virtual void set_key_image(char *buff,uint length)
  134.     { set_image(buff,length); }
  135.   inline int cmp_image(char *buff,uint length)
  136.     {
  137.       if (binary())
  138. return memcmp(ptr,buff,length);
  139.       else
  140. return my_casecmp(ptr,buff,length);
  141.     }
  142.   inline longlong val_int_offset(uint row_offset)
  143.     {
  144.       ptr+=row_offset;
  145.       longlong tmp=val_int();
  146.       ptr-=row_offset;
  147.       return tmp;
  148.     }
  149.   bool send(String *packet);
  150.   virtual char *pack(char* to, const char *from, uint max_length=~(uint) 0)
  151.   {
  152.     uint length=pack_length();
  153.     memcpy(to,from,length);
  154.     return to+length;
  155.   }
  156.   virtual const char *unpack(char* to, const char *from)
  157.   {
  158.     uint length=pack_length();
  159.     memcpy(to,from,length);
  160.     return from+length;
  161.   }
  162.   virtual char *pack_key(char* to, const char *from, uint max_length)
  163.   {
  164.     return pack(to,from,max_length);
  165.   }
  166.   virtual char *pack_key_from_key_image(char* to, const char *from,
  167. uint max_length)
  168.   {
  169.     return pack(to,from,max_length);
  170.   }
  171.   virtual uint packed_col_length(const char *to)
  172.   { return pack_length();}
  173.   virtual uint max_packed_col_length(uint max_length)
  174.   { return pack_length();}
  175.   virtual int pack_cmp(const char *a,const char *b, uint key_length_arg)
  176.   { return cmp(a,b); }
  177.   virtual int pack_cmp(const char *b, uint key_length_arg)
  178.   { return cmp(ptr,b); }
  179.   uint offset(); // Should be inline ...
  180.   void copy_from_tmp(int offset);
  181.   uint fill_cache_field(struct st_cache_field *copy);
  182.   virtual bool get_date(TIME *ltime,bool fuzzydate);
  183.   virtual bool get_time(TIME *ltime);
  184.   friend bool reopen_table(THD *,struct st_table *,bool);
  185.   friend int cre_myisam(my_string name, register TABLE *form, uint options,
  186. ulonglong auto_increment_value);
  187.   friend class Copy_field;
  188.   friend class Item_avg_field;
  189.   friend class Item_std_field;
  190.   friend class Item_sum_num;
  191.   friend class Item_sum_sum;
  192.   friend class Item_sum_str;
  193.   friend class Item_sum_count;
  194.   friend class Item_sum_avg;
  195.   friend class Item_sum_std;
  196.   friend class Item_sum_min;
  197.   friend class Item_sum_max;
  198. };
  199. class Field_num :public Field {
  200. public:
  201.   const uint8 dec;
  202.   bool zerofill,unsigned_flag; // Purify cannot handle bit fields
  203.   Field_num(char *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
  204.     uint null_bit_arg, utype unireg_check_arg,
  205.     const char *field_name_arg,
  206.     struct st_table *table_arg,
  207.     uint dec_arg,bool zero_arg,bool unsigned_arg)
  208.     :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  209.    unireg_check_arg, field_name_arg, table_arg),
  210.      dec(dec_arg),zerofill(zero_arg),unsigned_flag(unsigned_arg)
  211.     {
  212.       if (zerofill)
  213. flags|=ZEROFILL_FLAG;
  214.       if (unsigned_flag)
  215. flags|=UNSIGNED_FLAG;
  216.     }
  217.   Item_result result_type () const { return REAL_RESULT; }
  218.   void prepend_zeros(String *value);
  219.   void add_zerofill_and_unsigned(String &res) const;
  220.   friend class create_field;
  221.   void make_field(Send_field *);
  222.   uint decimals() const { return dec; }
  223.   uint size_of() const { return sizeof(*this); }
  224.   bool eq_def(Field *field);
  225. };
  226. class Field_str :public Field {
  227. public:
  228.   Field_str(char *ptr_arg,uint32 len_arg, uchar *null_ptr_arg,
  229.     uint null_bit_arg, utype unireg_check_arg,
  230.     const char *field_name_arg,
  231.     struct st_table *table_arg)
  232.     :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  233.    unireg_check_arg, field_name_arg, table_arg)
  234.     {}
  235.   Item_result result_type () const { return STRING_RESULT; }
  236.   uint decimals() const { return NOT_FIXED_DEC; }
  237.   friend class create_field;
  238.   void make_field(Send_field *);
  239.   uint size_of() const { return sizeof(*this); }
  240. };
  241. class Field_decimal :public Field_num {
  242. public:
  243.   Field_decimal(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  244. uint null_bit_arg,
  245. enum utype unireg_check_arg, const char *field_name_arg,
  246. struct st_table *table_arg,
  247. uint dec_arg,bool zero_arg,bool unsigned_arg)
  248.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  249.        unireg_check_arg, field_name_arg, table_arg,
  250.        dec_arg, zero_arg,unsigned_arg)
  251.     {}
  252.   enum_field_types type() const { return FIELD_TYPE_DECIMAL;}
  253.   enum ha_base_keytype key_type() const
  254.     { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; }
  255.   void reset(void);
  256.   void store(const char *to,uint length);
  257.   void store(double nr);
  258.   void store(longlong nr);
  259.   double val_real(void);
  260.   longlong val_int(void);
  261.   String *val_str(String*,String *);
  262.   int cmp(const char *,const char*);
  263.   void sort_string(char *buff,uint length);
  264.   void overflow(bool negative);
  265.   bool zero_pack() const { return 0; }
  266.   void sql_type(String &str) const;
  267. };
  268. class Field_tiny :public Field_num {
  269. public:
  270.   Field_tiny(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  271.      uint null_bit_arg,
  272.      enum utype unireg_check_arg, const char *field_name_arg,
  273.      struct st_table *table_arg,
  274.      bool zero_arg, bool unsigned_arg)
  275.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  276.        unireg_check_arg, field_name_arg, table_arg,
  277.        0, zero_arg,unsigned_arg)
  278.     {}
  279.   enum Item_result result_type () const { return INT_RESULT; }
  280.   enum_field_types type() const { return FIELD_TYPE_TINY;}
  281.   enum ha_base_keytype key_type() const
  282.     { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
  283.   void store(const char *to,uint length);
  284.   void store(double nr);
  285.   void store(longlong nr);
  286.   double val_real(void);
  287.   longlong val_int(void);
  288.   String *val_str(String*,String *);
  289.   int cmp(const char *,const char*);
  290.   void sort_string(char *buff,uint length);
  291.   uint32 pack_length() const { return 1; }
  292.   void sql_type(String &str) const;
  293. };
  294. class Field_short :public Field_num {
  295. public:
  296.   Field_short(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  297.       uint null_bit_arg,
  298.       enum utype unireg_check_arg, const char *field_name_arg,
  299.       struct st_table *table_arg,
  300.       bool zero_arg, bool unsigned_arg)
  301.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  302.        unireg_check_arg, field_name_arg, table_arg,
  303.        0, zero_arg,unsigned_arg)
  304.     {}
  305.   enum Item_result result_type () const { return INT_RESULT; }
  306.   enum_field_types type() const { return FIELD_TYPE_SHORT;}
  307.   enum ha_base_keytype key_type() const
  308.     { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
  309.   void store(const char *to,uint length);
  310.   void store(double nr);
  311.   void store(longlong nr);
  312.   double val_real(void);
  313.   longlong val_int(void);
  314.   String *val_str(String*,String *);
  315.   int cmp(const char *,const char*);
  316.   void sort_string(char *buff,uint length);
  317.   uint32 pack_length() const { return 2; }
  318.   void sql_type(String &str) const;
  319. };
  320. class Field_medium :public Field_num {
  321. public:
  322.   Field_medium(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  323.       uint null_bit_arg,
  324.       enum utype unireg_check_arg, const char *field_name_arg,
  325.       struct st_table *table_arg,
  326.       bool zero_arg, bool unsigned_arg)
  327.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  328.        unireg_check_arg, field_name_arg, table_arg,
  329.        0, zero_arg,unsigned_arg)
  330.     {}
  331.   enum Item_result result_type () const { return INT_RESULT; }
  332.   enum_field_types type() const { return FIELD_TYPE_INT24;}
  333.   enum ha_base_keytype key_type() const
  334.     { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; }
  335.   void store(const char *to,uint length);
  336.   void store(double nr);
  337.   void store(longlong nr);
  338.   double val_real(void);
  339.   longlong val_int(void);
  340.   String *val_str(String*,String *);
  341.   int cmp(const char *,const char*);
  342.   void sort_string(char *buff,uint length);
  343.   uint32 pack_length() const { return 3; }
  344.   void sql_type(String &str) const;
  345. };
  346. class Field_long :public Field_num {
  347. public:
  348.   Field_long(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  349.      uint null_bit_arg,
  350.      enum utype unireg_check_arg, const char *field_name_arg,
  351.      struct st_table *table_arg,
  352.      bool zero_arg, bool unsigned_arg)
  353.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  354.        unireg_check_arg, field_name_arg, table_arg,
  355.        0, zero_arg,unsigned_arg)
  356.     {}
  357.   Field_long(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
  358.      struct st_table *table_arg,bool unsigned_arg)
  359.     :Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
  360.        NONE, field_name_arg, table_arg,0,0,unsigned_arg)
  361.     {}
  362.   enum Item_result result_type () const { return INT_RESULT; }
  363.   enum_field_types type() const { return FIELD_TYPE_LONG;}
  364.   enum ha_base_keytype key_type() const
  365.     { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
  366.   void store(const char *to,uint length);
  367.   void store(double nr);
  368.   void store(longlong nr);
  369.   double val_real(void);
  370.   longlong val_int(void);
  371.   String *val_str(String*,String *);
  372.   int cmp(const char *,const char*);
  373.   void sort_string(char *buff,uint length);
  374.   uint32 pack_length() const { return 4; }
  375.   void sql_type(String &str) const;
  376. };
  377. #ifdef HAVE_LONG_LONG
  378. class Field_longlong :public Field_num {
  379. public:
  380.   Field_longlong(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  381.       uint null_bit_arg,
  382.       enum utype unireg_check_arg, const char *field_name_arg,
  383.       struct st_table *table_arg,
  384.       bool zero_arg, bool unsigned_arg)
  385.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  386.        unireg_check_arg, field_name_arg, table_arg,
  387.        0, zero_arg,unsigned_arg)
  388.     {}
  389.   Field_longlong(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
  390.  struct st_table *table_arg)
  391.     :Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0,0,
  392.        NONE, field_name_arg, table_arg,0,0,0)
  393.     {}
  394.   enum Item_result result_type () const { return INT_RESULT; }
  395.   enum_field_types type() const { return FIELD_TYPE_LONGLONG;}
  396.   enum ha_base_keytype key_type() const
  397.     { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
  398.   void store(const char *to,uint length);
  399.   void store(double nr);
  400.   void store(longlong nr);
  401.   double val_real(void);
  402.   longlong val_int(void);
  403.   String *val_str(String*,String *);
  404.   int cmp(const char *,const char*);
  405.   void sort_string(char *buff,uint length);
  406.   uint32 pack_length() const { return 8; }
  407.   void sql_type(String &str) const;
  408. };
  409. #endif
  410. class Field_float :public Field_num {
  411. public:
  412.   Field_float(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  413.       uint null_bit_arg,
  414.       enum utype unireg_check_arg, const char *field_name_arg,
  415.       struct st_table *table_arg,
  416.        uint dec_arg,bool zero_arg,bool unsigned_arg)
  417.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  418.        unireg_check_arg, field_name_arg, table_arg,
  419.        dec_arg, zero_arg,unsigned_arg)
  420.     {}
  421.   enum_field_types type() const { return FIELD_TYPE_FLOAT;}
  422.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
  423.   void store(const char *to,uint length);
  424.   void store(double nr);
  425.   void store(longlong nr);
  426.   double val_real(void);
  427.   longlong val_int(void);
  428.   String *val_str(String*,String *);
  429.   int cmp(const char *,const char*);
  430.   void sort_string(char *buff,uint length);
  431.   uint32 pack_length() const { return sizeof(float); }
  432.   void sql_type(String &str) const;
  433. };
  434. class Field_double :public Field_num {
  435. public:
  436.   Field_double(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  437.        uint null_bit_arg,
  438.        enum utype unireg_check_arg, const char *field_name_arg,
  439.        struct st_table *table_arg,
  440.        uint dec_arg,bool zero_arg,bool unsigned_arg)
  441.     :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  442.        unireg_check_arg, field_name_arg, table_arg,
  443.        dec_arg, zero_arg,unsigned_arg)
  444.     {}
  445.   Field_double(uint32 len_arg, bool maybe_null_arg, const char *field_name_arg,
  446.        struct st_table *table_arg, uint dec_arg)
  447.     :Field_num((char*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0,
  448.        NONE, field_name_arg, table_arg,dec_arg,0,0)
  449.     {}
  450.   enum_field_types type() const { return FIELD_TYPE_DOUBLE;}
  451.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }
  452.   void store(const char *to,uint length);
  453.   void store(double nr);
  454.   void store(longlong nr);
  455.   double val_real(void);
  456.   longlong val_int(void);
  457.   String *val_str(String*,String *);
  458.   int cmp(const char *,const char*);
  459.   void sort_string(char *buff,uint length);
  460.   uint32 pack_length() const { return sizeof(double); }
  461.   void sql_type(String &str) const;
  462. };
  463. /* Everything saved in this will disapper. It will always return NULL */
  464. class Field_null :public Field_str {
  465.   static uchar null[1];
  466. public:
  467.   Field_null(char *ptr_arg, uint32 len_arg,
  468.      enum utype unireg_check_arg, const char *field_name_arg,
  469.      struct st_table *table_arg)
  470.     :Field_str(ptr_arg, len_arg, null, 1,
  471.        unireg_check_arg, field_name_arg, table_arg)
  472.     {}
  473.   enum_field_types type() const { return FIELD_TYPE_NULL;}
  474.   void store(const char *to, uint length) { null[0]=1; }
  475.   void store(double nr)   { null[0]=1; }
  476.   void store(longlong nr) { null[0]=1; }
  477.   double val_real(void) { return 0.0;}
  478.   longlong val_int(void) { return 0;}
  479.   String *val_str(String *value,String *value2)
  480.   { value2->length(0); return value2;}
  481.   int cmp(const char *a, const char *b) { return 0;}
  482.   void sort_string(char *buff, uint length)  {}
  483.   uint32 pack_length() const { return 0; }
  484.   void sql_type(String &str) const { str.set("null",4); }
  485.   uint size_of() const { return sizeof(*this); }
  486. };
  487. class Field_timestamp :public Field_num {
  488. public:
  489.   Field_timestamp(char *ptr_arg, uint32 len_arg,
  490.   enum utype unireg_check_arg, const char *field_name_arg,
  491.   struct st_table *table_arg);
  492.   enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; }
  493.   enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
  494.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
  495.   void store(const char *to,uint length);
  496.   void store(double nr);
  497.   void store(longlong nr);
  498.   double val_real(void);
  499.   longlong val_int(void);
  500.   String *val_str(String*,String *);
  501.   int cmp(const char *,const char*);
  502.   void sort_string(char *buff,uint length);
  503.   uint32 pack_length() const { return 4; }
  504.   void sql_type(String &str) const;
  505.   bool store_for_compare() { return 1; }
  506.   bool zero_pack() const { return 0; }
  507.   void set_time();
  508.   inline long get_timestamp()
  509.   {
  510. #ifdef WORDS_BIGENDIAN
  511.     if (table->db_low_byte_first)
  512.       return sint4korr(ptr);
  513. #endif
  514.     long tmp;
  515.     longget(tmp,ptr);
  516.     return tmp;
  517.   }
  518.   void fill_and_store(char *from,uint len);
  519.   bool get_date(TIME *ltime,bool fuzzydate);
  520.   bool get_time(TIME *ltime);
  521. };
  522. class Field_year :public Field_tiny {
  523. public:
  524.   Field_year(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  525.      uint null_bit_arg,
  526.      enum utype unireg_check_arg, const char *field_name_arg,
  527.      struct st_table *table_arg)
  528.     :Field_tiny(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  529. unireg_check_arg, field_name_arg, table_arg, 1, 1)
  530.     {}
  531.   enum_field_types type() const { return FIELD_TYPE_YEAR;}
  532.   void store(const char *to,uint length);
  533.   void store(double nr);
  534.   void store(longlong nr);
  535.   double val_real(void);
  536.   longlong val_int(void);
  537.   String *val_str(String*,String *);
  538.   void sql_type(String &str) const;
  539. };
  540. class Field_date :public Field_str {
  541. public:
  542.   Field_date(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  543.      enum utype unireg_check_arg, const char *field_name_arg,
  544.      struct st_table *table_arg)
  545.     :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
  546.        unireg_check_arg, field_name_arg, table_arg)
  547.     {}
  548.   enum_field_types type() const { return FIELD_TYPE_DATE;}
  549.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
  550.   enum Item_result cmp_type () const { return INT_RESULT; }
  551.   void store(const char *to,uint length);
  552.   void store(double nr);
  553.   void store(longlong nr);
  554.   double val_real(void);
  555.   longlong val_int(void);
  556.   String *val_str(String*,String *);
  557.   int cmp(const char *,const char*);
  558.   void sort_string(char *buff,uint length);
  559.   uint32 pack_length() const { return 4; }
  560.   void sql_type(String &str) const;
  561.   bool store_for_compare() { return 1; }
  562.   bool zero_pack() const { return 1; }
  563. };
  564. class Field_newdate :public Field_str {
  565. public:
  566.   Field_newdate(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  567. enum utype unireg_check_arg, const char *field_name_arg,
  568. struct st_table *table_arg)
  569.     :Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
  570.        unireg_check_arg, field_name_arg, table_arg)
  571.     {}
  572.   enum_field_types type() const { return FIELD_TYPE_DATE;}
  573.   enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; }
  574.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; }
  575.   enum Item_result cmp_type () const { return INT_RESULT; }
  576.   void store(const char *to,uint length);
  577.   void store(double nr);
  578.   void store(longlong nr);
  579.   void store_time(TIME *ltime,timestamp_type type);
  580.   double val_real(void);
  581.   longlong val_int(void);
  582.   String *val_str(String*,String *);
  583.   int cmp(const char *,const char*);
  584.   void sort_string(char *buff,uint length);
  585.   uint32 pack_length() const { return 3; }
  586.   void sql_type(String &str) const;
  587.   bool store_for_compare() { return 1; }
  588.   bool zero_pack() const { return 1; }
  589.   bool get_date(TIME *ltime,bool fuzzydate);
  590.   bool get_time(TIME *ltime);
  591. };
  592. class Field_time :public Field_str {
  593. public:
  594.   Field_time(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  595.      enum utype unireg_check_arg, const char *field_name_arg,
  596.      struct st_table *table_arg)
  597.     :Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg,
  598.        unireg_check_arg, field_name_arg, table_arg)
  599.     {}
  600.   enum_field_types type() const { return FIELD_TYPE_TIME;}
  601.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
  602.   enum Item_result cmp_type () const { return INT_RESULT; }
  603.   void store(const char *to,uint length);
  604.   void store(double nr);
  605.   void store(longlong nr);
  606.   double val_real(void);
  607.   longlong val_int(void);
  608.   String *val_str(String*,String *);
  609.   bool get_time(TIME *ltime);
  610.   int cmp(const char *,const char*);
  611.   void sort_string(char *buff,uint length);
  612.   uint32 pack_length() const { return 3; }
  613.   void sql_type(String &str) const;
  614.   bool store_for_compare() { return 1; }
  615.   bool zero_pack() const { return 1; }
  616. };
  617. class Field_datetime :public Field_str {
  618. public:
  619.   Field_datetime(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  620.  enum utype unireg_check_arg, const char *field_name_arg,
  621.  struct st_table *table_arg)
  622.     :Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
  623.        unireg_check_arg, field_name_arg, table_arg)
  624.     {}
  625.   enum_field_types type() const { return FIELD_TYPE_DATETIME;}
  626. #ifdef HAVE_LONG_LONG
  627.   enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
  628. #endif
  629.   enum Item_result cmp_type () const { return INT_RESULT; }
  630.   void store(const char *to,uint length);
  631.   void store(double nr);
  632.   void store(longlong nr);
  633.   void store_time(TIME *ltime,timestamp_type type);
  634.   double val_real(void);
  635.   longlong val_int(void);
  636.   String *val_str(String*,String *);
  637.   int cmp(const char *,const char*);
  638.   void sort_string(char *buff,uint length);
  639.   uint32 pack_length() const { return 8; }
  640.   void sql_type(String &str) const;
  641.   bool store_for_compare() { return 1; }
  642.   bool zero_pack() const { return 1; }
  643.   bool get_date(TIME *ltime,bool fuzzydate);
  644.   bool get_time(TIME *ltime);
  645. };
  646. class Field_string :public Field_str {
  647.   bool binary_flag;
  648. public:
  649.   Field_string(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg,
  650.        uint null_bit_arg,
  651.        enum utype unireg_check_arg, const char *field_name_arg,
  652.        struct st_table *table_arg,bool binary_arg)
  653.     :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  654.        unireg_check_arg, field_name_arg, table_arg),
  655.     binary_flag(binary_arg)
  656.     {
  657.       if (binary_arg)
  658. flags|=BINARY_FLAG;
  659.     }
  660.   Field_string(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
  661.        struct st_table *table_arg, bool binary_arg)
  662.     :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0,
  663.        NONE, field_name_arg, table_arg),
  664.     binary_flag(binary_arg)
  665.     {
  666.       if (binary_arg)
  667. flags|=BINARY_FLAG;
  668.     }
  669.   enum_field_types type() const
  670.   {
  671.     return ((table && table->db_create_options & HA_OPTION_PACK_RECORD &&
  672.      field_length >= 4) ?
  673.     FIELD_TYPE_VAR_STRING : FIELD_TYPE_STRING);
  674.   }
  675.   enum ha_base_keytype key_type() const
  676.     { return binary_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
  677.   bool zero_pack() const { return 0; }
  678.   bool binary() const { return binary_flag; }
  679.   void reset(void) { bfill(ptr,field_length,' '); }
  680.   void store(const char *to,uint length);
  681.   void store(double nr);
  682.   void store(longlong nr);
  683.   double val_real(void);
  684.   longlong val_int(void);
  685.   String *val_str(String*,String *);
  686.   int cmp(const char *,const char*);
  687.   void sort_string(char *buff,uint length);
  688.   void sql_type(String &str) const;
  689.   char *pack(char *to, const char *from, uint max_length=~(uint) 0);
  690.   const char *unpack(char* to, const char *from);
  691.   int pack_cmp(const char *a,const char *b,uint key_length);
  692.   int pack_cmp(const char *b,uint key_length);
  693.   uint packed_col_length(const char *to);
  694.   uint max_packed_col_length(uint max_length);
  695.   uint size_of() const { return sizeof(*this); }
  696.   enum_field_types real_type() const { return FIELD_TYPE_STRING; }
  697. };
  698. class Field_varstring :public Field_str {
  699.   bool binary_flag;
  700. public:
  701.   Field_varstring(char *ptr_arg, uint32 len_arg,uchar *null_ptr_arg,
  702.   uint null_bit_arg,
  703.   enum utype unireg_check_arg, const char *field_name_arg,
  704.   struct st_table *table_arg,bool binary_arg)
  705.     :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  706.        unireg_check_arg, field_name_arg, table_arg),
  707.     binary_flag(binary_arg)
  708.     {
  709.       if (binary_arg)
  710. flags|=BINARY_FLAG;
  711.     }
  712.   Field_varstring(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
  713.   struct st_table *table_arg, bool binary_arg)
  714.     :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0,
  715.        NONE, field_name_arg, table_arg),
  716.     binary_flag(binary_arg)
  717.     {
  718.       if (binary_arg)
  719. flags|=BINARY_FLAG;
  720.     }
  721.   enum_field_types type() const { return FIELD_TYPE_VAR_STRING; }
  722.   enum ha_base_keytype key_type() const
  723.     { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; }
  724.   bool zero_pack() const { return 0; }
  725.   bool binary() const { return binary_flag; }
  726.   void reset(void) { bzero(ptr,field_length+2); }
  727.   uint32 pack_length() const { return (uint32) field_length+2; }
  728.   uint32 key_length() const { return (uint32) field_length; }
  729.   void store(const char *to,uint length);
  730.   void store(double nr);
  731.   void store(longlong nr);
  732.   double val_real(void);
  733.   longlong val_int(void);
  734.   String *val_str(String*,String *);
  735.   int cmp(const char *,const char*);
  736.   void sort_string(char *buff,uint length);
  737.   void sql_type(String &str) const;
  738.   char *pack(char *to, const char *from, uint max_length=~(uint) 0);
  739.   const char *unpack(char* to, const char *from);
  740.   int pack_cmp(const char *a, const char *b, uint key_length);
  741.   int pack_cmp(const char *b, uint key_length);
  742.   uint packed_col_length(const char *to);
  743.   uint max_packed_col_length(uint max_length);
  744.   uint size_of() const { return sizeof(*this); }
  745.   enum_field_types real_type() const { return FIELD_TYPE_VAR_STRING; }
  746. };
  747. class Field_blob :public Field_str {
  748.   uint packlength;
  749.   String value; // For temporaries
  750.   bool binary_flag;
  751. public:
  752.   Field_blob(char *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg,
  753.      enum utype unireg_check_arg, const char *field_name_arg,
  754.      struct st_table *table_arg,uint blob_pack_length,
  755.      bool binary_arg);
  756.   Field_blob(uint32 len_arg,bool maybe_null_arg, const char *field_name_arg,
  757.      struct st_table *table_arg, bool binary_arg)
  758.     :Field_str((char*) 0,len_arg, maybe_null_arg ? (uchar*) "": 0,0,
  759.        NONE, field_name_arg, table_arg),
  760.     packlength(3),binary_flag(binary_arg)
  761.     {
  762.       flags|= BLOB_FLAG;
  763.       if (binary_arg)
  764. flags|=BINARY_FLAG;
  765.     }
  766.   enum_field_types type() const { return FIELD_TYPE_BLOB;}
  767.   enum ha_base_keytype key_type() const
  768.     { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; }
  769.   void store(const char *to,uint length);
  770.   void store(double nr);
  771.   void store(longlong nr);
  772.   double val_real(void);
  773.   longlong val_int(void);
  774.   String *val_str(String*,String *);
  775.   int cmp(const char *,const char*);
  776.   int cmp(const char *a, ulong a_length, const char *b, ulong b_length);
  777.   int cmp_offset(uint offset);
  778.   int cmp_binary(const char *a,const char *b, ulong max_length=~0L);
  779.   int cmp_binary_offset(uint row_offset);
  780.   int key_cmp(const byte *,const byte*);
  781.   int key_cmp(const byte *str, uint length);
  782.   uint32 key_length() const { return 0; }
  783.   void sort_string(char *buff,uint length);
  784.   uint32 pack_length() const { return (uint32) (packlength+table->blob_ptr_size); }
  785.   void reset(void) { bzero(ptr,packlength+sizeof(char*)); }
  786.   void reset_fields() { bzero((char*) &value,sizeof(value)); }
  787.   void store_length(ulong number);
  788.   inline ulong get_length(uint row_offset=0)
  789.   { return get_length(ptr+row_offset); }
  790.   ulong get_length(const char *ptr);
  791.   bool binary() const { return binary_flag; }
  792.   inline void get_ptr(char **str)
  793.     {
  794.       memcpy_fixed(str,ptr+packlength,sizeof(char*));
  795.     }
  796.   inline void set_ptr(char *length,char *data)
  797.     {
  798.       memcpy(ptr,length,packlength);
  799.       memcpy_fixed(ptr+packlength,&data,sizeof(char*));
  800.     }
  801.   inline void set_ptr(ulong length,char *data)
  802.     {
  803.       store_length(length);
  804.       memcpy_fixed(ptr+packlength,&data,sizeof(char*));
  805.     }
  806.   void get_key_image(char *buff,uint length);
  807.   void set_key_image(char *buff,uint length);
  808.   void sql_type(String &str) const;
  809.   inline bool copy()
  810.   { char *tmp;
  811.     get_ptr(&tmp);
  812.     if (value.copy(tmp,get_length()))
  813.     {
  814.       Field_blob::reset();
  815.       return 1;
  816.     }
  817.     tmp=(char*) value.ptr(); memcpy_fixed(ptr+packlength,&tmp,sizeof(char*));
  818.     return 0;
  819.   }
  820.   char *pack(char *to, const char *from, uint max_length= ~(uint) 0);
  821.   const char *unpack(char *to, const char *from);
  822.   char *pack_key(char *to, const char *from, uint max_length);
  823.   char *pack_key_from_key_image(char* to, const char *from, uint max_length);
  824.   int pack_cmp(const char *a, const char *b, uint key_length);
  825.   int pack_cmp(const char *b, uint key_length);
  826.   uint packed_col_length(const char *col_ptr)
  827.   { return get_length(col_ptr)+packlength;}
  828.   virtual uint max_packed_col_length(uint max_length)
  829.   { return packlength+max_length; }
  830.   inline void free() { value.free(); }
  831.   inline void clear_temporary() { bzero((char*) &value,sizeof(value)); }
  832.   friend void field_conv(Field *to,Field *from);
  833.   uint size_of() const { return sizeof(*this); }
  834. };
  835. class Field_enum :public Field_str {
  836. protected:
  837.   uint packlength;
  838. public:
  839.   TYPELIB *typelib;
  840.   Field_enum(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  841.  uint null_bit_arg,
  842.  enum utype unireg_check_arg, const char *field_name_arg,
  843.  struct st_table *table_arg,uint packlength_arg,
  844.  TYPELIB *typelib_arg)
  845.     :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  846.        unireg_check_arg, field_name_arg, table_arg),
  847.     packlength(packlength_arg),typelib(typelib_arg)
  848.     {
  849.       flags|=ENUM_FLAG;
  850.     }
  851.   enum_field_types type() const { return FIELD_TYPE_STRING; }
  852.   enum Item_result cmp_type () const { return INT_RESULT; }
  853.   enum ha_base_keytype key_type() const;
  854.   void store(const char *to,uint length);
  855.   void store(double nr);
  856.   void store(longlong nr);
  857.   double val_real(void);
  858.   longlong val_int(void);
  859.   String *val_str(String*,String *);
  860.   int cmp(const char *,const char*);
  861.   void sort_string(char *buff,uint length);
  862.   uint32 pack_length() const { return (uint32) packlength; }
  863.   void store_type(ulonglong value);
  864.   void sql_type(String &str) const;
  865.   uint size_of() const { return sizeof(*this); }
  866.   enum_field_types real_type() const { return FIELD_TYPE_ENUM; }
  867.   virtual bool zero_pack() const { return 0; }
  868.   bool optimize_range() { return 0; }
  869.   bool binary() const { return 0; }
  870.   bool eq_def(Field *field);
  871. };
  872. class Field_set :public Field_enum {
  873. public:
  874.   Field_set(char *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
  875.     uint null_bit_arg,
  876.     enum utype unireg_check_arg, const char *field_name_arg,
  877.     struct st_table *table_arg,uint32 packlength_arg,
  878.     TYPELIB *typelib_arg)
  879.     :Field_enum(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
  880.     unireg_check_arg, field_name_arg,
  881.     table_arg, packlength_arg,
  882.     typelib_arg)
  883.     {
  884.       flags=(flags & ~ENUM_FLAG) | SET_FLAG;
  885.     }
  886.   void store(const char *to,uint length);
  887.   void store(double nr) { Field_set::store((longlong) nr); }
  888.   void store(longlong nr);
  889.   virtual bool zero_pack() const { return 1; }
  890.   String *val_str(String*,String *);
  891.   void sql_type(String &str) const;
  892.   enum_field_types real_type() const { return FIELD_TYPE_SET; }
  893. };
  894. /*
  895. ** Create field class for CREATE TABLE
  896. */
  897. class create_field :public Sql_alloc {
  898. public:
  899.   const char *field_name;
  900.   const char *change; // If done with alter table
  901.   const char *after; // Put column after this one
  902.   Item *def; // Default value
  903.   enum enum_field_types sql_type;
  904.   uint32 length;
  905.   uint decimals,flags,pack_length;
  906.   Field::utype unireg_check;
  907.   TYPELIB *interval; // Which interval to use
  908.   Field *field; // For alter table
  909.   uint8 row,col,sc_length,interval_id; // For rea_create_table
  910.   uint offset,pack_flag;
  911.   create_field() :after(0) {}
  912.   create_field(Field *field, Field *orig_field);
  913. };
  914. /*
  915. ** A class for sending info to the client
  916. */
  917. class Send_field {
  918.  public:
  919.   const char *table_name,*col_name;
  920.   uint length,flags,decimals;
  921.   enum_field_types type;
  922.   Send_field() {}
  923. };
  924. /*
  925. ** A class for quick copying data to fields
  926. */
  927. class Copy_field :public Sql_alloc {
  928.   void (*get_copy_func(Field *to,Field *from))(Copy_field *);
  929. public:
  930.   char *from_ptr,*to_ptr;
  931.   uchar *from_null_ptr,*to_null_ptr;
  932.   my_bool *null_row;
  933.   uint from_bit,to_bit;
  934.   uint from_length,to_length;
  935.   Field *from_field,*to_field;
  936.   String tmp; // For items
  937.   Copy_field() {}
  938.   ~Copy_field() {}
  939.   void set(Field *to,Field *from,bool save); // Field to field
  940.   void set(char *to,Field *from); // Field to string
  941.   void (*do_copy)(Copy_field *);
  942.   void (*do_copy2)(Copy_field *); // Used to handle null values
  943. };
  944. Field *make_field(char *ptr, uint32 field_length,
  945.   uchar *null_pos, uint null_bit,
  946.   uint pack_flag, Field::utype unireg_check,
  947.   TYPELIB *interval, const char *field_name,
  948.   struct st_table *table);
  949. uint pack_length_to_packflag(uint type);
  950. uint32 calc_pack_length(enum_field_types type,uint32 length);
  951. bool set_field_to_null(Field *field);
  952. uint find_enum(TYPELIB *typelib,const char *x, uint length);
  953. ulonglong find_set(TYPELIB *typelib,const char *x, uint length);
  954. bool test_if_int(const char *str,int length);
  955. /*
  956. ** The following are for the interface with the .frm file
  957. */
  958. #define FIELDFLAG_DECIMAL 1
  959. #define FIELDFLAG_BINARY 1 // Shares same flag
  960. #define FIELDFLAG_NUMBER 2
  961. #define FIELDFLAG_ZEROFILL 4
  962. #define FIELDFLAG_PACK 120 // Bits used for packing
  963. #define FIELDFLAG_INTERVAL 256
  964. #define FIELDFLAG_BITFIELD 512 // mangled with dec!
  965. #define FIELDFLAG_BLOB 1024 // mangled with dec!
  966. #define FIELDFLAG_LEFT_FULLSCREEN 8192
  967. #define FIELDFLAG_RIGHT_FULLSCREEN 16384
  968. #define FIELDFLAG_FORMAT_NUMBER 16384 // predit: ###,,## in output
  969. #define FIELDFLAG_SUM ((uint) 32768)// predit: +#fieldflag
  970. #define FIELDFLAG_MAYBE_NULL ((uint) 32768)// sql
  971. #define FIELDFLAG_PACK_SHIFT 3
  972. #define FIELDFLAG_DEC_SHIFT 8
  973. #define FIELDFLAG_MAX_DEC 31
  974. #define FIELDFLAG_NUM_SCREEN_TYPE 0x7F01
  975. #define FIELDFLAG_ALFA_SCREEN_TYPE 0x7800
  976. #define FIELD_SORT_REVERSE 16384
  977. #define MTYP_TYPENR(type) (type & 127) /* Remove bits from type */
  978. #define f_is_dec(x) ((x) & FIELDFLAG_DECIMAL)
  979. #define f_is_num(x) ((x) & FIELDFLAG_NUMBER)
  980. #define f_is_zerofill(x) ((x) & FIELDFLAG_ZEROFILL)
  981. #define f_is_packed(x) ((x) & FIELDFLAG_PACK)
  982. #define f_packtype(x) (((x) >> FIELDFLAG_PACK_SHIFT) & 15)
  983. #define f_decimals(x) (((x) >> FIELDFLAG_DEC_SHIFT) & FIELDFLAG_MAX_DEC)
  984. #define f_is_alpha(x) (!f_is_num(x))
  985. #define f_is_binary(x) ((x) & FIELDFLAG_BINARY)
  986. #define f_is_enum(x) ((x) & FIELDFLAG_INTERVAL)
  987. #define f_is_bitfield(x) ((x) & FIELDFLAG_BITFIELD)
  988. #define f_is_blob(x) (((x) & (FIELDFLAG_BLOB | FIELDFLAG_NUMBER)) == FIELDFLAG_BLOB)
  989. #define f_is_equ(x) ((x) & (1+2+FIELDFLAG_PACK+31*256))
  990. #define f_settype(x) (((int) x) << FIELDFLAG_PACK_SHIFT)
  991. #define f_maybe_null(x) (x & FIELDFLAG_MAYBE_NULL)