~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/field.h

  • Committer: Stewart Smith
  • Date: 2008-08-02 07:12:36 UTC
  • mfrom: (258 drizzle)
  • mto: This revision was merged to the branch mainline in revision 408.
  • Revision ID: stewart@flamingspork.com-20080802071236-kbcozl5zm23j6mkn
mergeĀ fromĀ mainline

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems, Inc.
5
 
 *
6
 
 *  This program is free software; you can redistribute it and/or modify
7
 
 *  it under the terms of the GNU General Public License as published by
8
 
 *  the Free Software Foundation; version 2 of the License.
9
 
 *
10
 
 *  This program is distributed in the hope that it will be useful,
11
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 *  GNU General Public License for more details.
14
 
 *
15
 
 *  You should have received a copy of the GNU General Public License
16
 
 *  along with this program; if not, write to the Free Software
17
 
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 
 */
 
1
/* Copyright (C) 2000-2006 MySQL 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; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
15
 
19
16
 
20
17
/*
21
18
  Because of the function new_field() all field classes that have static
22
19
  variables must declare the size_of() member function.
23
20
*/
24
21
 
25
 
 
26
 
 
27
 
#ifndef DRIZZLED_FIELD_H
28
 
#define DRIZZLED_FIELD_H
29
 
 
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_info.h"
36
 
#include "drizzled/item_result.h"
37
 
#include "drizzled/charset_info.h"
38
 
 
39
 
#include <string>
40
 
#include <vector>
41
 
 
42
 
#include "drizzled/visibility.h"
43
 
 
44
 
namespace drizzled
45
 
{
 
22
#ifdef USE_PRAGMA_INTERFACE
 
23
#pragma interface                       /* gcc class implementation */
 
24
#endif
46
25
 
47
26
#define DATETIME_DEC                     6
48
27
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
49
28
 
50
 
#ifdef DEBUG
51
 
#define ASSERT_COLUMN_MARKED_FOR_READ assert(!getTable() || (getTable()->read_set == NULL || isReadSet()))
52
 
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(!getTable() || (getTable()->write_set == NULL || isWriteSet()))
53
 
#else
54
 
#define ASSERT_COLUMN_MARKED_FOR_READ assert(getTable())
55
 
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(getTable())
56
 
#endif
57
 
 
58
 
typedef struct st_typelib TYPELIB;
59
 
 
60
29
const uint32_t max_field_size= (uint32_t) 4294967295U;
61
30
 
62
 
class SendField;
63
 
class CreateField;
64
 
class TableShare;
65
 
class Field;
66
 
struct CacheField;
67
 
 
 
31
class Send_field;
 
32
class Protocol;
 
33
class Create_field;
 
34
struct st_cache_field;
68
35
int field_conv(Field *to,Field *from);
69
36
 
70
 
/**
71
 
 * Class representing a Field in a Table
72
 
 *
73
 
 * @details
74
 
 *
75
 
 * The value stored in the Field object is stored in the
76
 
 * unsigned char pointer member variable called ptr.  The
77
 
 * val_xxx() methods retrieve this raw byte value and
78
 
 * convert the byte into the appropriate output (int, decimal, etc).
79
 
 *
80
 
 * The store_xxx() methods take various input and convert
81
 
 * the input into the raw bytes stored in the ptr member variable.
82
 
 */
83
 
class DRIZZLED_API Field
84
 
{
85
 
  /* Prevent use of these */
86
 
  Field(const Field&);
 
37
inline uint get_enum_pack_length(int elements)
 
38
{
 
39
  return elements < 256 ? 1 : 2;
 
40
}
 
41
 
 
42
inline uint get_set_pack_length(int elements)
 
43
{
 
44
  uint len= (elements + 7) / 8;
 
45
  return len > 4 ? 8 : len;
 
46
}
 
47
 
 
48
class Field
 
49
{
 
50
  Field(const Item &);                          /* Prevent use of these */
87
51
  void operator=(Field &);
88
 
 
89
 
public:
90
 
  unsigned char *ptr; /**< Position to field in record. Stores raw field value */
91
 
  unsigned char *null_ptr; /**< Byte where null_bit is */
92
 
 
93
 
  /**
94
 
   * Pointer to the Table object containing this Field
95
 
   *
96
 
   * @note You can use table->in_use as replacement for current_session member
97
 
   * only inside of val_*() and store() members (e.g. you can't use it in cons)
98
 
   */
99
 
private:
100
 
  Table *table;
101
 
 
102
 
public:
103
 
  Table *getTable()
104
 
  {
105
 
    assert(table);
106
 
    return table;
107
 
  }
108
 
 
109
 
  Table *getTable() const
110
 
  {
111
 
    assert(table);
112
 
    return table;
113
 
  }
114
 
 
115
 
  void setTable(Table *table_arg)
116
 
  {
117
 
    table= table_arg;
118
 
  }
119
 
 
120
 
  Table *orig_table; /**< Pointer to the original Table. @TODO What is "the original table"? */
121
 
  const char *field_name; /**< Name of the field */
122
 
  LEX_STRING comment; /**< A comment about the field */
123
 
 
124
 
  /** The field is part of the following keys */
125
 
  key_map       key_start;
126
 
  key_map part_of_key;
127
 
  key_map part_of_key_not_clustered;
128
 
  key_map part_of_sortkey;
129
 
 
 
52
public:
 
53
  static void *operator new(size_t size) {return sql_alloc(size); }
 
54
  static void operator delete(void *ptr_arg __attribute__((unused)),
 
55
                              size_t size __attribute__((unused)))
 
56
  { TRASH(ptr_arg, size); }
 
57
 
 
58
  uchar         *ptr;                   // Position to field in record
 
59
  uchar         *null_ptr;              // Byte where null_bit is
130
60
  /*
131
 
    We use three additional unireg types for TIMESTAMP for hysterical
132
 
    raisins and limitations in the MySQL FRM file format.
133
 
 
134
 
    A good TODO is to clean this up as we can support just about
135
 
    anything in the table proto message now.
136
 
  */
137
 
  enum utype
138
 
  {
139
 
    NONE,
140
 
    NEXT_NUMBER,
141
 
    TIMESTAMP_OLD_FIELD,
142
 
    TIMESTAMP_DN_FIELD,
143
 
    TIMESTAMP_UN_FIELD,
144
 
    TIMESTAMP_DNUN_FIELD
145
 
  };
146
 
 
147
 
  utype unireg_check;
148
 
  uint32_t field_length; /**< Length of this field in bytes */
149
 
  uint32_t flags;
150
 
 
151
 
  bool isUnsigned() const
152
 
  {
153
 
    return flags & UNSIGNED_FLAG;
154
 
  }
155
 
 
156
 
private:
157
 
  uint16_t field_index; /**< Index of this Field in Table::fields array */
158
 
 
159
 
public:
160
 
 
161
 
  uint16_t position() const
162
 
  {
163
 
    return field_index;
164
 
  }
165
 
 
166
 
  void setPosition(uint32_t arg)
167
 
  {
168
 
    field_index= arg;
169
 
  }
170
 
 
171
 
  unsigned char null_bit; /**< Bit used to test null bit */
 
61
    Note that you can use table->in_use as replacement for current_thd member 
 
62
    only inside of val_*() and store() members (e.g. you can't use it in cons)
 
63
  */
 
64
  struct st_table *table;               // Pointer for table
 
65
  struct st_table *orig_table;          // Pointer to original table
 
66
  const char    **table_name, *field_name;
 
67
  LEX_STRING    comment;
 
68
  /* Field is part of the following keys */
 
69
  key_map       key_start, part_of_key, part_of_key_not_clustered;
 
70
  key_map       part_of_sortkey;
 
71
  /* 
 
72
    We use three additional unireg types for TIMESTAMP to overcome limitation 
 
73
    of current binary format of .frm file. We'd like to be able to support 
 
74
    NOW() as default and on update value for such fields but unable to hold 
 
75
    this info anywhere except unireg_check field. This issue will be resolved
 
76
    in more clean way with transition to new text based .frm format.
 
77
    See also comment for Field_timestamp::Field_timestamp().
 
78
  */
 
79
  enum utype  { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
 
80
                CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
 
81
                BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD,
 
82
                TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD};
 
83
  enum imagetype { itRAW, itMBR};
 
84
 
 
85
  utype         unireg_check;
 
86
  uint32_t      field_length;           // Length of field
 
87
  uint32_t      flags;
 
88
  uint16_t        field_index;            // field number in fields array
 
89
  uchar         null_bit;               // Bit used to test null bit
172
90
  /**
173
91
     If true, this field was created in create_tmp_field_from_item from a NULL
174
92
     value. This means that the type of the field is just a guess, and the type
176
94
 
177
95
     @see create_tmp_field_from_item
178
96
     @see Item_type_holder::get_real_type
 
97
 
179
98
   */
180
99
  bool is_created_from_null_item;
181
100
 
182
 
  static void *operator new(size_t size);
183
 
  static void *operator new(size_t size, memory::Root *mem_root);
184
 
  static void operator delete(void *, size_t)
185
 
  { }
186
 
  static void operator delete(void *, memory::Root *)
187
 
  { }
188
 
 
189
 
  Field(unsigned char *ptr_arg,
190
 
        uint32_t length_arg,
191
 
        unsigned char *null_ptr_arg,
192
 
        unsigned char null_bit_arg,
193
 
        utype unireg_check_arg,
 
101
  Field(uchar *ptr_arg,uint32_t length_arg,uchar *null_ptr_arg,
 
102
        uchar null_bit_arg, utype unireg_check_arg,
194
103
        const char *field_name_arg);
195
104
  virtual ~Field() {}
196
 
 
197
 
  bool hasDefault() const
198
 
  {
199
 
    return not (flags & NO_DEFAULT_VALUE_FLAG);
200
 
  }
201
 
 
202
105
  /* Store functions returns 1 on overflow and -1 on fatal error */
203
 
  virtual int store(const char *to,
204
 
                    uint32_t length,
205
 
                    const CHARSET_INFO * const cs)=0;
206
 
  virtual int store(double nr)=0;
207
 
  virtual int store(int64_t nr, bool unsigned_val)=0;
208
 
  virtual int store_decimal(const type::Decimal *d)=0;
209
 
  int store_and_check(enum_check_fields check_level,
210
 
                      const char *to,
211
 
                      uint32_t length,
212
 
                      const CHARSET_INFO * const cs);
213
 
  /**
214
 
    This is called when storing a date in a string.
215
 
 
216
 
    @note
217
 
      Needs to be changed if/when we want to support different time formats.
218
 
  */
219
 
  virtual int store_time(type::Time &ltime, type::timestamp_t t_type);
220
 
  virtual double val_real()=0;
221
 
  virtual int64_t val_int()=0;
222
 
  virtual type::Decimal *val_decimal(type::Decimal *);
223
 
  String *val_str_internal(String *str)
224
 
  {
225
 
    return val_str(str, str);
226
 
  }
227
 
 
 
106
  virtual int  store(const char *to, uint length,CHARSET_INFO *cs)=0;
 
107
  virtual int  store(double nr)=0;
 
108
  virtual int  store(int64_t nr, bool unsigned_val)=0;
 
109
  virtual int  store_decimal(const my_decimal *d)=0;
 
110
  virtual int store_time(DRIZZLE_TIME *ltime, timestamp_type t_type);
 
111
  int store(const char *to, uint length, CHARSET_INFO *cs,
 
112
            enum_check_fields check_level);
 
113
  virtual double val_real(void)=0;
 
114
  virtual int64_t val_int(void)=0;
 
115
  virtual my_decimal *val_decimal(my_decimal *);
 
116
  inline String *val_str(String *str) { return val_str(str, str); }
228
117
  /*
229
118
     val_str(buf1, buf2) gets two buffers and should use them as follows:
230
119
     if it needs a temp buffer to convert result to string - use buf1
237
126
     an unnecessary free (and later, may be an alloc).
238
127
     This trickery is used to decrease a number of malloc calls.
239
128
  */
240
 
  virtual String *val_str(String*, String *)=0;
241
 
 
 
129
  virtual String *val_str(String*,String *)=0;
 
130
  String *val_int_as_str(String *val_buffer, my_bool unsigned_flag);
242
131
  /*
243
132
   str_needs_quotes() returns true if the value returned by val_str() needs
244
133
   to be quoted when used in constructing an SQL query.
247
136
  virtual Item_result result_type () const=0;
248
137
  virtual Item_result cmp_type () const { return result_type(); }
249
138
  virtual Item_result cast_to_int_type () const { return result_type(); }
250
 
 
251
 
  /**
252
 
     Check whether a field type can be partially indexed by a key.
253
 
 
254
 
     This is a static method, rather than a virtual function, because we need
255
 
     to check the type of a non-Field in alter_table().
256
 
 
257
 
     @param type  field type
258
 
 
259
 
     @retval
260
 
       true  Type can have a prefixed key
261
 
     @retval
262
 
       false Type can not have a prefixed key
263
 
  */
264
139
  static bool type_can_have_key_part(enum_field_types);
265
 
  /**
266
 
    Return type of which can carry value of both given types in UNION result.
267
 
 
268
 
    @param a  type for merging
269
 
    @param b  type for merging
270
 
 
271
 
    @retval
272
 
      type of field
273
 
  */
274
140
  static enum_field_types field_type_merge(enum_field_types, enum_field_types);
275
 
 
276
 
  /**
277
 
     Detect Item_result by given field type of UNION merge result.
278
 
 
279
 
     @param field_type  given field type
280
 
 
281
 
     @return
282
 
       Item_result (type of internal MySQL expression result)
283
 
  */
284
141
  static Item_result result_merge_type(enum_field_types);
285
 
 
286
 
  virtual bool eq(Field *field);
287
 
  /**
288
 
   * Returns true if the fields are equally defined
289
 
   *
290
 
   * @retval
291
 
   *  true  This Field is equally defined to supplied Field
292
 
   * @retval
293
 
   *  false This Field is NOT equally defined to supplied Field
294
 
   */
 
142
  virtual bool eq(Field *field)
 
143
  {
 
144
    return (ptr == field->ptr && null_ptr == field->null_ptr &&
 
145
            null_bit == field->null_bit);
 
146
  }
295
147
  virtual bool eq_def(Field *field);
296
 
 
297
 
  virtual bool is_timestamp() const
298
 
  {
299
 
    return false;
300
 
  }
301
 
 
302
 
  /**
303
 
   * Returns size (in bytes) used to store field data in memory
304
 
   * (i.e. it returns the maximum size of the field in a row of the table,
305
 
   * which is located in RAM).
306
 
   */
307
 
  virtual uint32_t pack_length() const;
308
 
 
309
 
  /**
310
 
   * Returns size (in bytes) used to store field data on
311
 
   * storage (i.e. it returns the maximal size of the field in a row of the
312
 
   * table, which is located on disk).
313
 
   */
314
 
  virtual uint32_t pack_length_in_rec() const;
315
 
 
316
 
  /**
317
 
   * Return the "real size" of the data in memory.
318
 
   * For varstrings, this does _not_ include the length bytes.
319
 
   */
320
 
  virtual uint32_t data_length();
321
 
  /**
322
 
   * Returns the number of bytes actually used to store the data
323
 
   * of the field. So for a varstring it includes both lenght byte(s) and
324
 
   * string data, and anything after data_length() bytes are unused.
325
 
   */
326
 
  virtual uint32_t used_length();
327
 
  virtual uint32_t sort_length() const;
 
148
  
 
149
  /*
 
150
    pack_length() returns size (in bytes) used to store field data in memory
 
151
    (i.e. it returns the maximum size of the field in a row of the table,
 
152
    which is located in RAM).
 
153
  */
 
154
  virtual uint32_t pack_length() const { return (uint32_t) field_length; }
 
155
 
 
156
  /*
 
157
    pack_length_in_rec() returns size (in bytes) used to store field data on
 
158
    storage (i.e. it returns the maximal size of the field in a row of the
 
159
    table, which is located on disk).
 
160
  */
 
161
  virtual uint32_t pack_length_in_rec() const { return pack_length(); }
 
162
  virtual int compatible_field_size(uint field_metadata);
 
163
  virtual uint pack_length_from_metadata(uint field_metadata)
 
164
  { return field_metadata; }
 
165
  /*
 
166
    This method is used to return the size of the data in a row-based
 
167
    replication row record. The default implementation of returning 0 is
 
168
    designed to allow fields that do not use metadata to return true (1)
 
169
    from compatible_field_size() which uses this function in the comparison.
 
170
    The default value for field metadata for fields that do not have 
 
171
    metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
 
172
 
 
173
    Note: While most classes that override this method return pack_length(),
 
174
    the classes Field_varstring, and Field_blob return 
 
175
    field_length + 1, field_length, and pack_length_no_ptr() respectfully.
 
176
  */
 
177
  virtual uint row_pack_length() { return 0; }
 
178
  virtual int save_field_metadata(uchar *first_byte)
 
179
  { return do_save_field_metadata(first_byte); }
 
180
 
 
181
  /*
 
182
    data_length() return the "real size" of the data in memory.
 
183
    For varstrings, this does _not_ include the length bytes.
 
184
  */
 
185
  virtual uint32_t data_length() { return pack_length(); }
 
186
  /*
 
187
    used_length() returns the number of bytes actually used to store the data
 
188
    of the field. So for a varstring it includes both lenght byte(s) and
 
189
    string data, and anything after data_length() bytes are unused.
 
190
  */
 
191
  virtual uint32_t used_length() { return pack_length(); }
 
192
  virtual uint32_t sort_length() const { return pack_length(); }
328
193
 
329
194
  /**
330
195
     Get the maximum size of the data in packed format.
332
197
     @return Maximum data length of the field when packed using the
333
198
     Field::pack() function.
334
199
   */
335
 
  virtual uint32_t max_data_length() const;
336
 
  virtual int reset(void);
337
 
  virtual void reset_fields();
338
 
  virtual void set_default();
339
 
  virtual bool binary() const;
340
 
  virtual bool zero_pack() const;
341
 
  virtual enum ha_base_keytype key_type() const;
342
 
  virtual uint32_t key_length() const;
 
200
  virtual uint32_t max_data_length() const {
 
201
    return pack_length();
 
202
  };
 
203
 
 
204
  virtual int reset(void) { memset(ptr, 0, pack_length()); return 0; }
 
205
  virtual void reset_fields() {}
 
206
  virtual void set_default()
 
207
  {
 
208
    my_ptrdiff_t l_offset= (my_ptrdiff_t) (table->s->default_values - table->record[0]);
 
209
    memcpy(ptr, ptr + l_offset, pack_length());
 
210
    if (null_ptr)
 
211
      *null_ptr= ((*null_ptr & (uchar) ~null_bit) | (null_ptr[l_offset] & null_bit));
 
212
  }
 
213
  virtual bool binary() const { return 1; }
 
214
  virtual bool zero_pack() const { return 1; }
 
215
  virtual enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
 
216
  virtual uint32_t key_length() const { return pack_length(); }
343
217
  virtual enum_field_types type() const =0;
344
 
  virtual enum_field_types real_type() const;
345
 
  virtual int cmp_max(const unsigned char *a, const unsigned char *b, uint32_t max_len);
346
 
  virtual int cmp(const unsigned char *,const unsigned char *)=0;
347
 
  int cmp_internal(const unsigned char *str) { return cmp(ptr,str); }
348
 
  virtual int cmp_binary(const unsigned char *a,const unsigned char *b,
349
 
                         uint32_t max_length=UINT32_MAX);
350
 
  virtual int cmp_offset(uint32_t row_offset);
351
 
  virtual int cmp_binary_offset(uint32_t row_offset);
352
 
  virtual int key_cmp(const unsigned char *a,const unsigned char *b);
353
 
  virtual int key_cmp(const unsigned char *str, uint32_t length);
354
 
  virtual uint32_t decimals() const;
355
 
 
 
218
  virtual enum_field_types real_type() const { return type(); }
 
219
  inline  int cmp(const uchar *str) { return cmp(ptr,str); }
 
220
  virtual int cmp_max(const uchar *a, const uchar *b,
 
221
                      uint max_len __attribute__((unused)))
 
222
    { return cmp(a, b); }
 
223
  virtual int cmp(const uchar *,const uchar *)=0;
 
224
  virtual int cmp_binary(const uchar *a,const uchar *b,
 
225
                         uint32_t  __attribute__((unused)) max_length=~0)
 
226
  { return memcmp(a,b,pack_length()); }
 
227
  virtual int cmp_offset(uint row_offset)
 
228
  { return cmp(ptr,ptr+row_offset); }
 
229
  virtual int cmp_binary_offset(uint row_offset)
 
230
  { return cmp_binary(ptr, ptr+row_offset); };
 
231
  virtual int key_cmp(const uchar *a,const uchar *b)
 
232
  { return cmp(a, b); }
 
233
  virtual int key_cmp(const uchar *str, uint length __attribute__((unused)))
 
234
  { return cmp(ptr,str); }
 
235
  virtual uint decimals() const { return 0; }
356
236
  /*
357
237
    Caller beware: sql_type can change str.Ptr, so check
358
238
    ptr() to see if it changed if you are using your own buffer
359
239
    in str and restore it with set() if needed
360
240
  */
361
241
  virtual void sql_type(String &str) const =0;
362
 
 
363
 
  // For new field
364
 
  virtual uint32_t size_of() const =0;
365
 
 
366
 
  bool is_null(ptrdiff_t row_offset= 0);
367
 
  bool is_real_null(ptrdiff_t row_offset= 0);
368
 
  bool is_null_in_record(const unsigned char *record);
369
 
  bool is_null_in_record_with_offset(ptrdiff_t offset);
370
 
  void set_null(ptrdiff_t row_offset= 0);
371
 
  void set_notnull(ptrdiff_t row_offset= 0);
372
 
  bool maybe_null(void);
373
 
  bool real_maybe_null(void);
374
 
 
375
 
  virtual void make_field(SendField *);
376
 
  virtual void sort_string(unsigned char *buff,uint32_t length)=0;
377
 
  virtual bool optimize_range(uint32_t idx, uint32_t part);
378
 
  /**
379
 
   * Returns true for fields which, when compared with constant
380
 
   * items, can be casted to int64_t. In this case we will at 'fix_fields'
381
 
   * stage cast the constant items to int64_ts and at the execution stage
382
 
   * use field->val_int() for comparison.  Used to optimize clauses like
383
 
   * 'a_column BETWEEN date_const AND date_const'.
 
242
  virtual uint size_of() const =0;              // For new field
 
243
  inline bool is_null(my_ptrdiff_t row_offset= 0)
 
244
  { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : table->null_row; }
 
245
  inline bool is_real_null(my_ptrdiff_t row_offset= 0)
 
246
    { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; }
 
247
  inline bool is_null_in_record(const uchar *record)
 
248
  {
 
249
    if (!null_ptr)
 
250
      return 0;
 
251
    return test(record[(uint) (null_ptr -table->record[0])] &
 
252
                null_bit);
 
253
  }
 
254
  inline bool is_null_in_record_with_offset(my_ptrdiff_t offset)
 
255
  {
 
256
    if (!null_ptr)
 
257
      return 0;
 
258
    return test(null_ptr[offset] & null_bit);
 
259
  }
 
260
  inline void set_null(my_ptrdiff_t row_offset= 0)
 
261
    { if (null_ptr) null_ptr[row_offset]|= null_bit; }
 
262
  inline void set_notnull(my_ptrdiff_t row_offset= 0)
 
263
    { if (null_ptr) null_ptr[row_offset]&= (uchar) ~null_bit; }
 
264
  inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; }
 
265
  inline bool real_maybe_null(void) { return null_ptr != 0; }
 
266
 
 
267
  enum {
 
268
    LAST_NULL_BYTE_UNDEF= 0
 
269
  };
 
270
 
 
271
  /*
 
272
    Find the position of the last null byte for the field.
 
273
 
 
274
    SYNOPSIS
 
275
      last_null_byte()
 
276
 
 
277
    DESCRIPTION
 
278
      Return a pointer to the last byte of the null bytes where the
 
279
      field conceptually is placed.
 
280
 
 
281
    RETURN VALUE
 
282
      The position of the last null byte relative to the beginning of
 
283
      the record. If the field does not use any bits of the null
 
284
      bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned.
384
285
   */
385
 
  virtual bool can_be_compared_as_int64_t() const
386
 
  {
387
 
    return false;
 
286
  size_t last_null_byte() const {
 
287
    size_t bytes= do_last_null_byte();
 
288
    assert(bytes <= table->s->null_bytes);
 
289
    return bytes;
388
290
  }
 
291
 
 
292
  virtual void make_field(Send_field *);
 
293
  virtual void sort_string(uchar *buff,uint length)=0;
 
294
  virtual bool optimize_range(uint idx, uint part);
 
295
  /*
 
296
    This should be true for fields which, when compared with constant
 
297
    items, can be casted to int64_t. In this case we will at 'fix_fields'
 
298
    stage cast the constant items to int64_ts and at the execution stage
 
299
    use field->val_int() for comparison.  Used to optimize clauses like
 
300
    'a_column BETWEEN date_const, date_const'.
 
301
  */
 
302
  virtual bool can_be_compared_as_int64_t() const { return false; }
389
303
  virtual void free() {}
390
 
  virtual Field *new_field(memory::Root *root,
391
 
                           Table *new_table,
 
304
  virtual Field *new_field(MEM_ROOT *root, struct st_table *new_table,
392
305
                           bool keep_type);
393
 
  virtual Field *new_key_field(memory::Root *root, Table *new_table,
394
 
                               unsigned char *new_ptr,
395
 
                               unsigned char *new_null_ptr,
396
 
                               uint32_t new_null_bit);
397
 
  /** This is used to generate a field in Table from TableShare */
398
 
  Field *clone(memory::Root *mem_root, Table *new_table);
399
 
  void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
 
306
  virtual Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,
 
307
                               uchar *new_ptr, uchar *new_null_ptr,
 
308
                               uint new_null_bit);
 
309
  Field *clone(MEM_ROOT *mem_root, struct st_table *new_table);
 
310
  inline void move_field(uchar *ptr_arg,uchar *null_ptr_arg,uchar null_bit_arg)
400
311
  {
401
 
    ptr= ptr_arg;
402
 
    null_ptr= null_ptr_arg;
403
 
    null_bit= null_bit_arg;
 
312
    ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
404
313
  }
405
 
  void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
406
 
  virtual void move_field_offset(ptrdiff_t ptr_diff)
 
314
  inline void move_field(uchar *ptr_arg) { ptr=ptr_arg; }
 
315
  virtual void move_field_offset(my_ptrdiff_t ptr_diff)
407
316
  {
408
 
    ptr= ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
 
317
    ptr=ADD_TO_PTR(ptr,ptr_diff, uchar*);
409
318
    if (null_ptr)
410
 
      null_ptr= ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
411
 
  }
412
 
  virtual void get_image(unsigned char *buff, uint32_t length, const CHARSET_INFO * const)
413
 
  {
414
 
    memcpy(buff,ptr,length);
415
 
  }
416
 
  virtual void get_image(std::basic_string<unsigned char> &buff, uint32_t length, const CHARSET_INFO * const)
417
 
  {
418
 
    buff.append(ptr,length);
419
 
  }
420
 
  virtual void set_image(const unsigned char *buff,uint32_t length, const CHARSET_INFO * const)
421
 
  {
422
 
    memcpy(ptr,buff,length);
423
 
  }
424
 
 
425
 
  /**
426
 
   * Copy a field part into an output buffer.
427
 
   *
428
 
   * @details
429
 
   *
430
 
   * This function makes a copy of field part of size equal to or
431
 
   * less than "length" parameter value.
432
 
   * For fields of string types (VARCHAR, TEXT) the rest of buffer
433
 
   * is padded by zero byte.
434
 
   *
435
 
   * @param output buffer
436
 
   * @param output buffer size
437
 
   *
438
 
   * @note
439
 
   *
440
 
   * For variable length character fields (i.e. UTF-8) the "length"
441
 
   * parameter means a number of output buffer bytes as if all field
442
 
   * characters have maximal possible size (mbmaxlen). In the other words,
443
 
   * "length" parameter is a number of characters multiplied by
444
 
   * field_charset->mbmaxlen.
445
 
   *
446
 
   * @retval
447
 
   *   Number of copied bytes (excluding padded zero bytes -- see above).
448
 
   */
449
 
  virtual uint32_t get_key_image(unsigned char *buff, uint32_t length)
450
 
  {
451
 
    get_image(buff, length, &my_charset_bin);
452
 
    return length;
453
 
  }
454
 
  virtual uint32_t get_key_image(std::basic_string<unsigned char> &buff, uint32_t length)
455
 
  {
456
 
    get_image(buff, length, &my_charset_bin);
457
 
    return length;
458
 
  }
459
 
  virtual void set_key_image(const unsigned char *buff,uint32_t length)
460
 
  {
461
 
    set_image(buff,length, &my_charset_bin);
462
 
  }
463
 
  int64_t val_int_offset(uint32_t row_offset)
464
 
  {
465
 
    ptr+=row_offset;
466
 
    int64_t tmp=val_int();
467
 
    ptr-=row_offset;
468
 
    return tmp;
469
 
  }
470
 
 
471
 
  int64_t val_int_internal(const unsigned char *new_ptr)
472
 
  {
473
 
    unsigned char *old_ptr= ptr;
 
319
      null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,uchar*);
 
320
  }
 
321
  virtual void get_image(uchar *buff, uint length,
 
322
                         CHARSET_INFO *cs __attribute__((unused)))
 
323
    { memcpy(buff,ptr,length); }
 
324
  virtual void set_image(const uchar *buff,uint length,
 
325
                         CHARSET_INFO *cs __attribute__((unused)))
 
326
    { memcpy(ptr,buff,length); }
 
327
 
 
328
 
 
329
  /*
 
330
    Copy a field part into an output buffer.
 
331
 
 
332
    SYNOPSIS
 
333
      Field::get_key_image()
 
334
      buff   [out] output buffer
 
335
      length       output buffer size
 
336
      type         itMBR for geometry blobs, otherwise itRAW
 
337
 
 
338
    DESCRIPTION
 
339
      This function makes a copy of field part of size equal to or
 
340
      less than "length" parameter value.
 
341
      For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
 
342
      is padded by zero byte.
 
343
 
 
344
    NOTES
 
345
      For variable length character fields (i.e. UTF-8) the "length"
 
346
      parameter means a number of output buffer bytes as if all field
 
347
      characters have maximal possible size (mbmaxlen). In the other words,
 
348
      "length" parameter is a number of characters multiplied by
 
349
      field_charset->mbmaxlen.
 
350
 
 
351
    RETURN
 
352
      Number of copied bytes (excluding padded zero bytes -- see above).
 
353
  */
 
354
 
 
355
  virtual uint get_key_image(uchar *buff, uint length,
 
356
                             imagetype type __attribute__((unused)))
 
357
  {
 
358
    get_image(buff, length, &my_charset_bin);
 
359
    return length;
 
360
  }
 
361
  virtual void set_key_image(const uchar *buff,uint length)
 
362
    { set_image(buff,length, &my_charset_bin); }
 
363
  inline int64_t val_int_offset(uint row_offset)
 
364
    {
 
365
      ptr+=row_offset;
 
366
      int64_t tmp=val_int();
 
367
      ptr-=row_offset;
 
368
      return tmp;
 
369
    }
 
370
  inline int64_t val_int(const uchar *new_ptr)
 
371
  {
 
372
    uchar *old_ptr= ptr;
474
373
    int64_t return_value;
475
 
    ptr= const_cast<unsigned char*>(new_ptr);
 
374
    ptr= (uchar*) new_ptr;
476
375
    return_value= val_int();
477
376
    ptr= old_ptr;
478
377
    return return_value;
479
378
  }
480
 
 
481
 
  String *val_str_internal(String *str, const unsigned char *new_ptr)
 
379
  inline String *val_str(String *str, const uchar *new_ptr)
482
380
  {
483
 
    unsigned char *old_ptr= ptr;
484
 
    ptr= const_cast<unsigned char*>(new_ptr);
485
 
    val_str_internal(str);
 
381
    uchar *old_ptr= ptr;
 
382
    ptr= (uchar*) new_ptr;
 
383
    val_str(str);
486
384
    ptr= old_ptr;
487
385
    return str;
488
386
  }
489
 
 
490
 
  /**
491
 
    Pack the field into a format suitable for storage and transfer.
492
 
 
493
 
    To implement packing functionality, only the virtual function
494
 
    should be overridden. The other functions are just convenience
495
 
    functions and hence should not be overridden.
496
 
 
497
 
    The value of <code>low_byte_first</code> is dependent on how the
498
 
    packed data is going to be used: for local use, e.g., temporary
499
 
    store on disk or in memory, use the native format since that is
500
 
    faster. For data that is going to be transfered to other machines
501
 
    (e.g., when writing data to the binary log), data should always be
502
 
    stored in little-endian format.
503
 
 
504
 
    @note The default method for packing fields just copy the raw bytes
505
 
    of the record into the destination, but never more than
506
 
    <code>max_length</code> characters.
507
 
 
508
 
    @param to
509
 
    Pointer to memory area where representation of field should be put.
510
 
 
511
 
    @param from
512
 
    Pointer to memory area where record representation of field is
513
 
    stored.
514
 
 
515
 
    @param max_length
516
 
    Maximum length of the field, as given in the column definition. For
517
 
    example, for <code>CHAR(1000)</code>, the <code>max_length</code>
518
 
    is 1000. This information is sometimes needed to decide how to pack
519
 
    the data.
520
 
 
521
 
    @param low_byte_first
522
 
    @c true if integers should be stored little-endian, @c false if
523
 
    native format should be used. Note that for little-endian machines,
524
 
    the value of this flag is a moot point since the native format is
525
 
    little-endian.
526
 
  */
527
 
  virtual unsigned char *pack(unsigned char *to,
528
 
                              const unsigned char *from,
529
 
                              uint32_t max_length,
530
 
                              bool low_byte_first);
531
 
 
532
 
  unsigned char *pack(unsigned char *to, const unsigned char *from);
533
 
 
534
 
  /**
535
 
    Unpack a field from row data.
536
 
 
537
 
    This method is used to unpack a field from a master whose size of
538
 
    the field is less than that of the slave.
539
 
 
540
 
    The <code>param_data</code> parameter is a two-byte integer (stored
541
 
    in the least significant 16 bits of the unsigned integer) usually
542
 
    consisting of two parts: the real type in the most significant byte
543
 
    and a original pack length in the least significant byte.
544
 
 
545
 
    The exact layout of the <code>param_data</code> field is given by
546
 
    the <code>Table_map_log_event::save_field_metadata()</code>.
547
 
 
548
 
    This is the default method for unpacking a field. It just copies
549
 
    the memory block in byte order (of original pack length bytes or
550
 
    length of field, whichever is smaller).
551
 
 
552
 
    @param   to         Destination of the data
553
 
    @param   from       Source of the data
554
 
    @param   param_data Real type and original pack length of the field
555
 
                        data
556
 
 
557
 
    @param low_byte_first
558
 
    If this flag is @c true, all composite entities (e.g., lengths)
559
 
    should be unpacked in little-endian format; otherwise, the entities
560
 
    are unpacked in native order.
561
 
 
562
 
    @return  New pointer into memory based on from + length of the data
563
 
  */
564
 
  virtual const unsigned char *unpack(unsigned char* to,
565
 
                                      const unsigned char *from,
566
 
                                      uint32_t param_data,
567
 
                                      bool low_byte_first);
568
 
  /**
569
 
     @overload Field::unpack(unsigned char*, const unsigned char*,
570
 
                             uint32_t, bool)
571
 
  */
572
 
  const unsigned char *unpack(unsigned char* to,
573
 
                              const unsigned char *from);
574
 
 
575
 
  virtual unsigned char *pack_key(unsigned char* to,
576
 
                                  const unsigned char *from,
577
 
                                  uint32_t max_length,
578
 
                                  bool low_byte_first)
579
 
  {
580
 
    return pack(to, from, max_length, low_byte_first);
581
 
  }
582
 
  virtual const unsigned char *unpack_key(unsigned char* to,
583
 
                                          const unsigned char *from,
584
 
                                          uint32_t max_length,
585
 
                                          bool low_byte_first)
 
387
  virtual bool send_binary(Protocol *protocol);
 
388
 
 
389
  virtual uchar *pack(uchar *to, const uchar *from,
 
390
                      uint max_length, bool low_byte_first);
 
391
  /**
 
392
     @overload Field::pack(uchar*, const uchar*, uint, bool)
 
393
  */
 
394
  uchar *pack(uchar *to, const uchar *from)
 
395
  {
 
396
    uchar *result= this->pack(to, from, UINT_MAX, table->s->db_low_byte_first);
 
397
    return(result);
 
398
  }
 
399
 
 
400
  virtual const uchar *unpack(uchar* to, const uchar *from,
 
401
                              uint param_data, bool low_byte_first);
 
402
  /**
 
403
     @overload Field::unpack(uchar*, const uchar*, uint, bool)
 
404
  */
 
405
  const uchar *unpack(uchar* to, const uchar *from)
 
406
  {
 
407
    const uchar *result= unpack(to, from, 0U, table->s->db_low_byte_first);
 
408
    return(result);
 
409
  }
 
410
 
 
411
  virtual uchar *pack_key(uchar* to, const uchar *from,
 
412
                          uint max_length, bool low_byte_first)
 
413
  {
 
414
    return pack(to, from, max_length, low_byte_first);
 
415
  }
 
416
  virtual uchar *pack_key_from_key_image(uchar* to, const uchar *from,
 
417
                                        uint max_length, bool low_byte_first)
 
418
  {
 
419
    return pack(to, from, max_length, low_byte_first);
 
420
  }
 
421
  virtual const uchar *unpack_key(uchar* to, const uchar *from,
 
422
                                  uint max_length, bool low_byte_first)
586
423
  {
587
424
    return unpack(to, from, max_length, low_byte_first);
588
425
  }
589
 
  virtual uint32_t max_packed_col_length(uint32_t max_length)
590
 
  {
591
 
    return max_length;
592
 
  }
 
426
  virtual uint packed_col_length(const uchar *to __attribute__((unused)),
 
427
                                 uint length)
 
428
  { return length;}
 
429
  virtual uint max_packed_col_length(uint max_length)
 
430
  { return max_length;}
593
431
 
594
 
  uint32_t offset(const unsigned char *record)
 
432
  virtual int pack_cmp(const uchar *a,const uchar *b,
 
433
                       uint key_length_arg __attribute__((unused)),
 
434
                       my_bool insert_or_update __attribute__((unused)))
 
435
  { return cmp(a,b); }
 
436
  virtual int pack_cmp(const uchar *b,
 
437
                       uint key_length_arg __attribute__((unused)),
 
438
                       my_bool insert_or_update __attribute__((unused)))
 
439
  { return cmp(ptr,b); }
 
440
  uint offset(uchar *record)
595
441
  {
596
 
    return (uint32_t) (ptr - record);
 
442
    return (uint) (ptr - record);
597
443
  }
598
444
  void copy_from_tmp(int offset);
599
 
  uint32_t fill_cache_field(CacheField *copy);
600
 
  virtual bool get_date(type::Time &ltime,uint32_t fuzzydate);
601
 
  virtual bool get_time(type::Time &ltime);
602
 
  virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
603
 
  virtual const CHARSET_INFO *sort_charset(void) const { return charset(); }
 
445
  uint fill_cache_field(struct st_cache_field *copy);
 
446
  virtual bool get_date(DRIZZLE_TIME *ltime,uint fuzzydate);
 
447
  virtual bool get_time(DRIZZLE_TIME *ltime);
 
448
  virtual CHARSET_INFO *charset(void) const { return &my_charset_bin; }
 
449
  virtual CHARSET_INFO *sort_charset(void) const { return charset(); }
604
450
  virtual bool has_charset(void) const { return false; }
605
 
  virtual void set_charset(const CHARSET_INFO * const)
606
 
  {}
 
451
  virtual void set_charset(CHARSET_INFO *charset_arg __attribute__((unused)))
 
452
  { }
607
453
  virtual enum Derivation derivation(void) const
608
 
  {
609
 
    return DERIVATION_IMPLICIT;
610
 
  }
611
 
  virtual void set_derivation(enum Derivation)
612
 
  {}
613
 
  /**
614
 
    Produce warning or note about data saved into field.
615
 
 
616
 
    @param level            - level of message (Note/Warning/Error)
617
 
    @param code             - error code of message to be produced
618
 
    @param cuted_increment  - whenever we should increase cut fields count or not
619
 
 
620
 
    @note
621
 
      This function won't produce warning and increase cut fields counter
622
 
      if count_cuted_fields == CHECK_FIELD_IGNORE for current thread.
623
 
 
624
 
      if count_cuted_fields == CHECK_FIELD_IGNORE then we ignore notes.
625
 
      This allows us to avoid notes in optimisation, like convert_constant_item().
626
 
 
627
 
    @retval
628
 
      1 if count_cuted_fields == CHECK_FIELD_IGNORE and error level is not NOTE
629
 
    @retval
630
 
      0 otherwise
631
 
  */
632
 
  bool set_warning(DRIZZLE_ERROR::enum_warning_level,
633
 
                   drizzled::error_t code,
 
454
  { return DERIVATION_IMPLICIT; }
 
455
  virtual void set_derivation(enum Derivation derivation_arg __attribute__((unused)))
 
456
  { }
 
457
  bool set_warning(MYSQL_ERROR::enum_warning_level, unsigned int code,
634
458
                   int cuted_increment);
635
 
  /**
636
 
    Produce warning or note about datetime string data saved into field.
637
 
 
638
 
    @param level            level of message (Note/Warning/Error)
639
 
    @param code             error code of message to be produced
640
 
    @param str              string value which we tried to save
641
 
    @param str_length       length of string which we tried to save
642
 
    @param ts_type          type of datetime value (datetime/date/time)
643
 
    @param cuted_increment  whenever we should increase cut fields count or not
644
 
 
645
 
    @note
646
 
      This function will always produce some warning but won't increase cut
647
 
      fields counter if count_cuted_fields ==FIELD_CHECK_IGNORE for current
648
 
      thread.
649
 
  */
650
 
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
651
 
                            drizzled::error_t code,
652
 
                            const char *str,
653
 
                            uint32_t str_len,
654
 
                            type::timestamp_t ts_type,
655
 
                            int cuted_increment);
656
 
  /**
657
 
    Produce warning or note about integer datetime value saved into field.
658
 
 
659
 
    @param level            level of message (Note/Warning/Error)
660
 
    @param code             error code of message to be produced
661
 
    @param nr               numeric value which we tried to save
662
 
    @param ts_type          type of datetime value (datetime/date/time)
663
 
    @param cuted_increment  whenever we should increase cut fields count or not
664
 
 
665
 
    @note
666
 
      This function will always produce some warning but won't increase cut
667
 
      fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
668
 
      thread.
669
 
  */
670
 
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
671
 
                            drizzled::error_t code,
672
 
                            int64_t nr,
673
 
                            type::timestamp_t ts_type,
674
 
                            int cuted_increment);
675
 
  /**
676
 
    Produce warning or note about double datetime data saved into field.
677
 
 
678
 
    @param level            level of message (Note/Warning/Error)
679
 
    @param code             error code of message to be produced
680
 
    @param nr               double value which we tried to save
681
 
    @param ts_type          type of datetime value (datetime/date/time)
682
 
 
683
 
    @note
684
 
      This function will always produce some warning but won't increase cut
685
 
      fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
686
 
      thread.
687
 
  */
688
 
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
689
 
                            const drizzled::error_t code,
690
 
                            double nr,
691
 
                            type::timestamp_t ts_type);
692
 
  bool check_overflow(int op_result)
 
459
  void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code, 
 
460
                            const char *str, uint str_len,
 
461
                            timestamp_type ts_type, int cuted_increment);
 
462
  void set_datetime_warning(MYSQL_ERROR::enum_warning_level, uint code, 
 
463
                            int64_t nr, timestamp_type ts_type,
 
464
                            int cuted_increment);
 
465
  void set_datetime_warning(MYSQL_ERROR::enum_warning_level, const uint code, 
 
466
                            double nr, timestamp_type ts_type);
 
467
  inline bool check_overflow(int op_result)
693
468
  {
694
469
    return (op_result == E_DEC_OVERFLOW);
695
470
  }
696
 
  /**
697
 
    Process decimal library return codes and issue warnings for overflow and
698
 
    truncation.
699
 
 
700
 
    @param op_result  decimal library return code (E_DEC_* see include/decimal.h)
701
 
 
702
 
    @retval
703
 
      E_DEC_OVERFLOW   there was overflow
704
 
      E_DEC_TRUNCATED  there was truncation
705
 
    @retval
706
 
      0  no error or there was some other error except overflow or truncation
707
 
  */
708
471
  int warn_if_overflow(int op_result);
709
 
  void init(Table *table_arg);
 
472
  void init(TABLE *table_arg)
 
473
  {
 
474
    orig_table= table= table_arg;
 
475
    table_name= &table_arg->alias;
 
476
  }
710
477
 
711
478
  /* maximum possible display length */
712
479
  virtual uint32_t max_display_length()= 0;
713
480
 
714
 
  virtual uint32_t is_equal(CreateField *new_field);
715
 
  /**
716
 
    Conversion from decimal to int64_t with checking overflow and
717
 
    setting correct value (min/max) in case of overflow.
718
 
 
719
 
    @param val             value which have to be converted
720
 
    @param unsigned_flag   type of integer in which we convert val
721
 
    @param err             variable to pass error code
722
 
 
723
 
    @return
724
 
      value converted from val
725
 
  */
726
 
  int64_t convert_decimal2int64_t(const type::Decimal *val,
727
 
                                  bool unsigned_flag,
728
 
                                  int *err);
 
481
  virtual uint is_equal(Create_field *new_field);
 
482
  /* convert decimal to int64_t with overflow check */
 
483
  int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
 
484
                                    int *err);
729
485
  /* The max. number of characters */
730
 
  uint32_t char_length() const
 
486
  inline uint32_t char_length() const
731
487
  {
732
488
    return field_length / charset()->mbmaxlen;
733
489
  }
734
490
 
735
 
  enum column_format_type column_format() const
 
491
  inline enum column_format_type column_format() const
736
492
  {
737
493
    return (enum column_format_type)
738
494
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
739
495
  }
740
496
 
741
497
  /* Hash value */
742
 
  virtual void hash(uint32_t *nr, uint32_t *nr2);
743
 
  friend bool reopen_table(Session *,Table *,bool);
744
 
 
745
 
  friend class CopyField;
 
498
  virtual void hash(ulong *nr, ulong *nr2);
 
499
  friend bool reopen_table(THD *,struct st_table *,bool);
 
500
  friend int cre_myisam(char * name, register TABLE *form, uint options,
 
501
                        uint64_t auto_increment_value);
 
502
  friend class Copy_field;
746
503
  friend class Item_avg_field;
747
504
  friend class Item_std_field;
748
505
  friend class Item_sum_num;
755
512
  friend class Item_sum_max;
756
513
  friend class Item_func_group_concat;
757
514
 
758
 
  bool isReadSet();
759
 
  bool isWriteSet();
760
 
  void setReadSet(bool arg= true);
761
 
  void setWriteSet(bool arg= true);
762
 
 
763
 
protected:
764
 
 
765
 
  void pack_num(uint64_t arg, unsigned char *destination= NULL);
766
 
  void pack_num(uint32_t arg, unsigned char *destination= NULL);
767
 
  uint64_t unpack_num(uint64_t &destination, const unsigned char *arg= NULL) const;
768
 
  uint32_t unpack_num(uint32_t &destination, const unsigned char *arg= NULL) const;
769
 
};
770
 
 
771
 
std::ostream& operator<<(std::ostream& output, const Field &field);
772
 
 
773
 
} /* namespace drizzled */
774
 
 
775
 
/** @TODO Why is this in the middle of the file???*/
776
 
#include "drizzled/create_field.h"
777
 
 
778
 
namespace drizzled
779
 
{
 
515
private:
 
516
  /*
 
517
    Primitive for implementing last_null_byte().
 
518
 
 
519
    SYNOPSIS
 
520
      do_last_null_byte()
 
521
 
 
522
    DESCRIPTION
 
523
      Primitive for the implementation of the last_null_byte()
 
524
      function. This represents the inheritance interface and can be
 
525
      overridden by subclasses.
 
526
   */
 
527
  virtual size_t do_last_null_byte() const;
780
528
 
781
529
/**
782
 
 * A class for sending field information to a client.
783
 
 *
784
 
 * @details
785
 
 *
786
 
 * Send_field is basically a stripped-down POD class for
787
 
 * representing basic information about a field...
788
 
 */
789
 
class SendField
790
 
{
791
 
public:
 
530
   Retrieve the field metadata for fields.
 
531
 
 
532
   This default implementation returns 0 and saves 0 in the metadata_ptr
 
533
   value.
 
534
 
 
535
   @param   metadata_ptr   First byte of field metadata
 
536
 
 
537
   @returns 0 no bytes written.
 
538
*/
 
539
  virtual int do_save_field_metadata(uchar *metadata_ptr __attribute__((unused)))
 
540
  { return 0; }
 
541
};
 
542
 
 
543
 
 
544
class Field_num :public Field {
 
545
public:
 
546
  const uint8_t dec;
 
547
  bool decimal_precision;       // Purify cannot handle bit fields & only for decimal type
 
548
  bool unsigned_flag;   // Purify cannot handle bit fields
 
549
  Field_num(uchar *ptr_arg,uint32_t len_arg, uchar *null_ptr_arg,
 
550
            uchar null_bit_arg, utype unireg_check_arg,
 
551
            const char *field_name_arg,
 
552
            uint8_t dec_arg, bool zero_arg, bool unsigned_arg);
 
553
  Item_result result_type () const { return REAL_RESULT; }
 
554
  void add_unsigned(String &res) const;
 
555
  friend class Create_field;
 
556
  void make_field(Send_field *);
 
557
  uint decimals() const { return (uint) dec; }
 
558
  uint size_of() const { return sizeof(*this); }
 
559
  bool eq_def(Field *field);
 
560
  int store_decimal(const my_decimal *);
 
561
  my_decimal *val_decimal(my_decimal *);
 
562
  uint is_equal(Create_field *new_field);
 
563
  int check_int(CHARSET_INFO *cs, const char *str, int length,
 
564
                const char *int_end, int error);
 
565
  bool get_int(CHARSET_INFO *cs, const char *from, uint len, 
 
566
               int64_t *rnd, uint64_t unsigned_max, 
 
567
               int64_t signed_min, int64_t signed_max);
 
568
};
 
569
 
 
570
/* base class for all string related classes */
 
571
 
 
572
class Field_str :public Field {
 
573
protected:
 
574
  CHARSET_INFO *field_charset;
 
575
  enum Derivation field_derivation;
 
576
public:
 
577
  Field_str(uchar *ptr_arg,uint32_t len_arg, uchar *null_ptr_arg,
 
578
            uchar null_bit_arg, utype unireg_check_arg,
 
579
            const char *field_name_arg, CHARSET_INFO *charset);
 
580
  Item_result result_type () const { return STRING_RESULT; }
 
581
  uint decimals() const { return NOT_FIXED_DEC; }
 
582
  int  store(double nr);
 
583
  int  store(int64_t nr, bool unsigned_val)=0;
 
584
  int  store_decimal(const my_decimal *);
 
585
  int  store(const char *to,uint length,CHARSET_INFO *cs)=0;
 
586
  uint size_of() const { return sizeof(*this); }
 
587
  CHARSET_INFO *charset(void) const { return field_charset; }
 
588
  void set_charset(CHARSET_INFO *charset_arg) { field_charset= charset_arg; }
 
589
  enum Derivation derivation(void) const { return field_derivation; }
 
590
  virtual void set_derivation(enum Derivation derivation_arg)
 
591
  { field_derivation= derivation_arg; }
 
592
  bool binary() const { return field_charset == &my_charset_bin; }
 
593
  uint32_t max_display_length() { return field_length; }
 
594
  friend class Create_field;
 
595
  my_decimal *val_decimal(my_decimal *);
 
596
  virtual bool str_needs_quotes() { return true; }
 
597
  bool compare_str_field_flags(Create_field *new_field, uint32_t flags);
 
598
  uint is_equal(Create_field *new_field);
 
599
};
 
600
 
 
601
 
 
602
/* base class for Field_varstring and Field_blob */
 
603
 
 
604
class Field_longstr :public Field_str
 
605
{
 
606
protected:
 
607
  int report_if_important_data(const char *ptr, const char *end);
 
608
public:
 
609
  Field_longstr(uchar *ptr_arg, uint32_t len_arg, uchar *null_ptr_arg,
 
610
                uchar null_bit_arg, utype unireg_check_arg,
 
611
                const char *field_name_arg, CHARSET_INFO *charset_arg)
 
612
    :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
 
613
               field_name_arg, charset_arg)
 
614
    {}
 
615
 
 
616
  int store_decimal(const my_decimal *d);
 
617
  uint32_t max_data_length() const;
 
618
};
 
619
 
 
620
/* base class for float and double and decimal (old one) */
 
621
class Field_real :public Field_num {
 
622
public:
 
623
  my_bool not_fixed;
 
624
 
 
625
  Field_real(uchar *ptr_arg, uint32_t len_arg, uchar *null_ptr_arg,
 
626
             uchar null_bit_arg, utype unireg_check_arg,
 
627
             const char *field_name_arg,
 
628
             uint8_t dec_arg, bool zero_arg, bool unsigned_arg)
 
629
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg,
 
630
               field_name_arg, dec_arg, zero_arg, unsigned_arg),
 
631
    not_fixed(dec_arg >= NOT_FIXED_DEC)
 
632
    {}
 
633
  int store_decimal(const my_decimal *);
 
634
  my_decimal *val_decimal(my_decimal *);
 
635
  int truncate(double *nr, double max_length);
 
636
  uint32_t max_display_length() { return field_length; }
 
637
  uint size_of() const { return sizeof(*this); }
 
638
  virtual const uchar *unpack(uchar* to, const uchar *from,
 
639
                              uint param_data, bool low_byte_first);
 
640
  virtual uchar *pack(uchar* to, const uchar *from,
 
641
                      uint max_length, bool low_byte_first);
 
642
};
 
643
 
 
644
 
 
645
class Field_tiny :public Field_num {
 
646
public:
 
647
  Field_tiny(uchar *ptr_arg, uint32_t len_arg, uchar *null_ptr_arg,
 
648
             uchar null_bit_arg,
 
649
             enum utype unireg_check_arg, const char *field_name_arg,
 
650
             bool zero_arg, bool unsigned_arg)
 
651
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
 
652
               unireg_check_arg, field_name_arg,
 
653
               0, zero_arg,unsigned_arg)
 
654
    {}
 
655
  enum Item_result result_type () const { return INT_RESULT; }
 
656
  enum_field_types type() const { return DRIZZLE_TYPE_TINY;}
 
657
  enum ha_base_keytype key_type() const
 
658
    { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
 
659
  int store(const char *to,uint length,CHARSET_INFO *charset);
 
660
  int store(double nr);
 
661
  int store(int64_t nr, bool unsigned_val);
 
662
  int reset(void) { ptr[0]=0; return 0; }
 
663
  double val_real(void);
 
664
  int64_t val_int(void);
 
665
  String *val_str(String*,String *);
 
666
  bool send_binary(Protocol *protocol);
 
667
  int cmp(const uchar *,const uchar *);
 
668
  void sort_string(uchar *buff,uint length);
 
669
  uint32_t pack_length() const { return 1; }
 
670
  void sql_type(String &str) const;
 
671
  uint32_t max_display_length() { return 4; }
 
672
 
 
673
  virtual uchar *pack(uchar* to, const uchar *from,
 
674
                      uint max_length __attribute__((unused)),
 
675
                      bool low_byte_first __attribute__((unused)))
 
676
  {
 
677
    *to= *from;
 
678
    return to + 1;
 
679
  }
 
680
 
 
681
  virtual const uchar *unpack(uchar* to, const uchar *from,
 
682
                              uint param_data __attribute__((unused)),
 
683
                              bool low_byte_first __attribute__((unused)))
 
684
  {
 
685
    *to= *from;
 
686
    return from + 1;
 
687
  }
 
688
};
 
689
 
 
690
 
 
691
class Field_enum :public Field_str {
 
692
protected:
 
693
  uint packlength;
 
694
public:
 
695
  TYPELIB *typelib;
 
696
  Field_enum(uchar *ptr_arg, uint32_t len_arg, uchar *null_ptr_arg,
 
697
             uchar null_bit_arg,
 
698
             enum utype unireg_check_arg, const char *field_name_arg,
 
699
             uint packlength_arg,
 
700
             TYPELIB *typelib_arg,
 
701
             CHARSET_INFO *charset_arg)
 
702
    :Field_str(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
 
703
               unireg_check_arg, field_name_arg, charset_arg),
 
704
    packlength(packlength_arg),typelib(typelib_arg)
 
705
  {
 
706
      flags|=ENUM_FLAG;
 
707
  }
 
708
  Field *new_field(MEM_ROOT *root, struct st_table *new_table, bool keep_type);
 
709
  enum_field_types type() const { return DRIZZLE_TYPE_ENUM; }
 
710
  enum Item_result cmp_type () const { return INT_RESULT; }
 
711
  enum Item_result cast_to_int_type () const { return INT_RESULT; }
 
712
  enum ha_base_keytype key_type() const;
 
713
  int  store(const char *to,uint length,CHARSET_INFO *charset);
 
714
  int  store(double nr);
 
715
  int  store(int64_t nr, bool unsigned_val);
 
716
  double val_real(void);
 
717
  int64_t val_int(void);
 
718
  String *val_str(String*,String *);
 
719
  int cmp(const uchar *,const uchar *);
 
720
  void sort_string(uchar *buff,uint length);
 
721
  uint32_t pack_length() const { return (uint32_t) packlength; }
 
722
  void store_type(uint64_t value);
 
723
  void sql_type(String &str) const;
 
724
  uint size_of() const { return sizeof(*this); }
 
725
  enum_field_types real_type() const { return DRIZZLE_TYPE_ENUM; }
 
726
  uint pack_length_from_metadata(uint field_metadata)
 
727
  { return (field_metadata & 0x00ff); }
 
728
  uint row_pack_length() { return pack_length(); }
 
729
  virtual bool zero_pack() const { return 0; }
 
730
  bool optimize_range(uint idx __attribute__((unused)),
 
731
                      uint part __attribute__((unused)))
 
732
  { return 0; }
 
733
  bool eq_def(Field *field);
 
734
  bool has_charset(void) const { return true; }
 
735
  /* enum and set are sorted as integers */
 
736
  CHARSET_INFO *sort_charset(void) const { return &my_charset_bin; }
 
737
private:
 
738
  int do_save_field_metadata(uchar *first_byte);
 
739
};
 
740
 
 
741
/*
 
742
  Create field class for CREATE TABLE
 
743
*/
 
744
 
 
745
class Create_field :public Sql_alloc
 
746
{
 
747
public:
 
748
  const char *field_name;
 
749
  const char *change;                   // If done with alter table
 
750
  const char *after;                    // Put column after this one
 
751
  LEX_STRING comment;                   // Comment for field
 
752
  Item  *def;                           // Default value
 
753
  enum  enum_field_types sql_type;
 
754
  /*
 
755
    At various stages in execution this can be length of field in bytes or
 
756
    max number of characters. 
 
757
  */
 
758
  ulong length;
 
759
  /*
 
760
    The value of `length' as set by parser: is the number of characters
 
761
    for most of the types, or of bytes for BLOBs or numeric types.
 
762
  */
 
763
  uint32_t char_length;
 
764
  uint  decimals, flags, pack_length, key_length;
 
765
  Field::utype unireg_check;
 
766
  TYPELIB *interval;                    // Which interval to use
 
767
  TYPELIB *save_interval;               // Temporary copy for the above
 
768
                                        // Used only for UCS2 intervals
 
769
  List<String> interval_list;
 
770
  CHARSET_INFO *charset;
 
771
  Field *field;                         // For alter table
 
772
 
 
773
  uint8_t row,col,sc_length,interval_id;        // For rea_create_table
 
774
  uint  offset,pack_flag;
 
775
  Create_field() :after(0) {}
 
776
  Create_field(Field *field, Field *orig_field);
 
777
  /* Used to make a clone of this object for ALTER/CREATE TABLE */
 
778
  Create_field *clone(MEM_ROOT *mem_root) const
 
779
    { return new (mem_root) Create_field(*this); }
 
780
  void create_length_to_internal_length(void);
 
781
 
 
782
  inline enum column_format_type column_format() const
 
783
  {
 
784
    return (enum column_format_type)
 
785
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
 
786
  }
 
787
 
 
788
  /* Init for a tmp table field. To be extended if need be. */
 
789
  void init_for_tmp_table(enum_field_types sql_type_arg,
 
790
                          uint32_t max_length, uint32_t decimals,
 
791
                          bool maybe_null, bool is_unsigned);
 
792
 
 
793
  bool init(THD *thd, char *field_name, enum_field_types type, char *length,
 
794
            char *decimals, uint type_modifier, Item *default_value,
 
795
            Item *on_update_value, LEX_STRING *comment, char *change,
 
796
            List<String> *interval_list, CHARSET_INFO *cs,
 
797
            uint uint_geom_type,
 
798
            enum column_format_type column_format);
 
799
};
 
800
 
 
801
 
 
802
/*
 
803
  A class for sending info to the client
 
804
*/
 
805
 
 
806
class Send_field {
 
807
 public:
792
808
  const char *db_name;
793
 
  const char *table_name;
794
 
  const char *org_table_name;
795
 
  const char *col_name;
796
 
  const char *org_col_name;
797
 
  uint32_t length;
798
 
  uint32_t charsetnr;
799
 
  uint32_t flags;
800
 
  uint32_t decimals;
 
809
  const char *table_name,*org_table_name;
 
810
  const char *col_name,*org_col_name;
 
811
  ulong length;
 
812
  uint charsetnr, flags, decimals;
801
813
  enum_field_types type;
802
 
  SendField() {}
803
 
};
804
 
 
805
 
uint32_t pack_length_to_packflag(uint32_t type);
 
814
  Send_field() {}
 
815
};
 
816
 
 
817
 
 
818
/*
 
819
  A class for quick copying data to fields
 
820
*/
 
821
 
 
822
class Copy_field :public Sql_alloc {
 
823
  /**
 
824
    Convenience definition of a copy function returned by
 
825
    get_copy_func.
 
826
  */
 
827
  typedef void Copy_func(Copy_field*);
 
828
  Copy_func *get_copy_func(Field *to, Field *from);
 
829
public:
 
830
  uchar *from_ptr,*to_ptr;
 
831
  uchar *from_null_ptr,*to_null_ptr;
 
832
  my_bool *null_row;
 
833
  uint  from_bit,to_bit;
 
834
  uint from_length,to_length;
 
835
  Field *from_field,*to_field;
 
836
  String tmp;                                   // For items
 
837
 
 
838
  Copy_field() {}
 
839
  ~Copy_field() {}
 
840
  void set(Field *to,Field *from,bool save);    // Field to field 
 
841
  void set(uchar *to,Field *from);              // Field to string
 
842
  void (*do_copy)(Copy_field *);
 
843
  void (*do_copy2)(Copy_field *);               // Used to handle null values
 
844
};
 
845
 
 
846
 
 
847
Field *make_field(TABLE_SHARE *share, uchar *ptr, uint32_t field_length,
 
848
                  uchar *null_pos, uchar null_bit,
 
849
                  uint pack_flag, enum_field_types field_type,
 
850
                  CHARSET_INFO *cs,
 
851
                  Field::utype unireg_check,
 
852
                  TYPELIB *interval, const char *field_name);
 
853
uint pack_length_to_packflag(uint type);
 
854
enum_field_types get_blob_type_from_length(ulong length);
806
855
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
807
856
int set_field_to_null(Field *field);
808
857
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
809
858
 
810
 
/**
811
 
 * Tests if the given string contains important data:
812
 
 * not spaces for character string, or any data for binary string.
813
 
 *
814
 
 * @param pointer to the character set to use
815
 
 * @param String to test
816
 
 * @param String end
817
 
 *
818
 
 * @retval
819
 
 *  false - If string does not have important data
820
 
 * @retval
821
 
 *  true  - If string has some important data
 
859
bool
 
860
check_string_copy_error(Field_str *field,
 
861
                        const char *well_formed_error_pos,
 
862
                        const char *cannot_convert_error_pos,
 
863
                        const char *end,
 
864
                        CHARSET_INFO *cs);
 
865
 
 
866
/*
 
867
  Field subclasses
822
868
 */
823
 
bool test_if_important_data(const CHARSET_INFO * const cs,
824
 
                            const char *str,
825
 
                            const char *strend);
826
 
 
827
 
} /* namespace drizzled */
828
 
 
829
 
#endif /* DRIZZLED_FIELD_H */
 
869
#include <drizzled/field/blob.h>
 
870
#include <drizzled/field/null.h>
 
871
#include <drizzled/field/date.h>
 
872
#include <drizzled/field/fdecimal.h>
 
873
#include <drizzled/field/double.h>
 
874
#include <drizzled/field/short.h>
 
875
#include <drizzled/field/long.h>
 
876
#include <drizzled/field/int64_t.h>
 
877
#include <drizzled/field/timetype.h>
 
878
#include <drizzled/field/timestamp.h>
 
879
#include <drizzled/field/datetime.h>
 
880
#include <drizzled/field/fstring.h>
 
881
#include <drizzled/field/varstring.h>
 
882
#include <drizzled/field/set.h>
 
883
 
 
884
/*
 
885
  The following are for the interface with the .frm file
 
886
*/
 
887
 
 
888
#define FIELDFLAG_DECIMAL               1
 
889
#define FIELDFLAG_BINARY                1       // Shares same flag
 
890
#define FIELDFLAG_NUMBER                2
 
891
#define FIELDFLAG_DECIMAL_POSITION      4
 
892
#define FIELDFLAG_PACK                  120     // Bits used for packing
 
893
#define FIELDFLAG_INTERVAL              256     // mangled with decimals!
 
894
#define FIELDFLAG_BITFIELD              512     // mangled with decimals!
 
895
#define FIELDFLAG_BLOB                  1024    // mangled with decimals!
 
896
#define FIELDFLAG_GEOM                  2048    // mangled with decimals!
 
897
 
 
898
#define FIELDFLAG_TREAT_BIT_AS_CHAR     4096    /* use Field_bit_as_char */
 
899
 
 
900
#define FIELDFLAG_LEFT_FULLSCREEN       8192
 
901
#define FIELDFLAG_RIGHT_FULLSCREEN      16384
 
902
#define FIELDFLAG_FORMAT_NUMBER         16384   // predit: ###,,## in output
 
903
#define FIELDFLAG_NO_DEFAULT            16384   /* sql */
 
904
#define FIELDFLAG_SUM                   ((uint) 32768)// predit: +#fieldflag
 
905
#define FIELDFLAG_MAYBE_NULL            ((uint) 32768)// sql
 
906
#define FIELDFLAG_HEX_ESCAPE            ((uint) 0x10000)
 
907
#define FIELDFLAG_PACK_SHIFT            3
 
908
#define FIELDFLAG_DEC_SHIFT             8
 
909
#define FIELDFLAG_MAX_DEC               31
 
910
#define FIELDFLAG_NUM_SCREEN_TYPE       0x7F01
 
911
#define FIELDFLAG_ALFA_SCREEN_TYPE      0x7800
 
912
 
 
913
#define MTYP_TYPENR(type) (type & 127)  /* Remove bits from type */
 
914
 
 
915
#define f_is_dec(x)             ((x) & FIELDFLAG_DECIMAL)
 
916
#define f_is_num(x)             ((x) & FIELDFLAG_NUMBER)
 
917
#define f_is_decimal_precision(x)       ((x) & FIELDFLAG_DECIMAL_POSITION)
 
918
#define f_is_packed(x)          ((x) & FIELDFLAG_PACK)
 
919
#define f_packtype(x)           (((x) >> FIELDFLAG_PACK_SHIFT) & 15)
 
920
#define f_decimals(x)           ((uint8_t) (((x) >> FIELDFLAG_DEC_SHIFT) & FIELDFLAG_MAX_DEC))
 
921
#define f_is_alpha(x)           (!f_is_num(x))
 
922
#define f_is_binary(x)          ((x) & FIELDFLAG_BINARY) // 4.0- compatibility
 
923
#define f_is_enum(x)            (((x) & (FIELDFLAG_INTERVAL | FIELDFLAG_NUMBER)) == FIELDFLAG_INTERVAL)
 
924
#define f_is_bitfield(x)        (((x) & (FIELDFLAG_BITFIELD | FIELDFLAG_NUMBER)) == FIELDFLAG_BITFIELD)
 
925
#define f_is_blob(x)            (((x) & (FIELDFLAG_BLOB | FIELDFLAG_NUMBER)) == FIELDFLAG_BLOB)
 
926
#define f_is_equ(x)             ((x) & (1+2+FIELDFLAG_PACK+31*256))
 
927
#define f_settype(x)            (((int) x) << FIELDFLAG_PACK_SHIFT)
 
928
#define f_maybe_null(x)         (x & FIELDFLAG_MAYBE_NULL)
 
929
#define f_no_default(x)         (x & FIELDFLAG_NO_DEFAULT)
 
930
#define f_bit_as_char(x)        ((x) & FIELDFLAG_TREAT_BIT_AS_CHAR)
 
931
#define f_is_hex_escape(x)      ((x) & FIELDFLAG_HEX_ESCAPE)
 
932