~drizzle-trunk/drizzle/development

390.1.2 by Monty Taylor
Fixed copyright headers in drizzled/
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
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 by brian
clean slate
19
20
/*
21
  Because of the function new_field() all field classes that have static
22
  variables must declare the size_of() member function.
23
*/
24
25
26
#define DATETIME_DEC                     6
173.1.9 by Toru Maesaka
ripped out DOUBLE and moved to field/
27
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
28
205 by Brian Aker
uint32 -> uin32_t
29
const uint32_t max_field_size= (uint32_t) 4294967295U;
1 by brian
clean slate
30
31
class Send_field;
32
class Protocol;
33
class Create_field;
34
struct st_cache_field;
35
int field_conv(Field *to,Field *from);
36
438.1.13 by Brian Aker
uint cleanup.
37
inline uint32_t get_enum_pack_length(int elements)
1 by brian
clean slate
38
{
39
  return elements < 256 ? 1 : 2;
40
}
41
438.1.13 by Brian Aker
uint cleanup.
42
inline uint32_t get_set_pack_length(int elements)
1 by brian
clean slate
43
{
438.1.13 by Brian Aker
uint cleanup.
44
  uint32_t len= (elements + 7) / 8;
1 by brian
clean slate
45
  return len > 4 ? 8 : len;
46
}
47
383.7.1 by Andrey Zhakov
Initial submit of code and tests
48
class virtual_column_info: public Sql_alloc
49
{
50
public:
51
  Item *expr_item;
52
  LEX_STRING expr_str;
53
  Item *item_free_list;
54
  virtual_column_info() 
55
  : expr_item(0), item_free_list(0),
56
    field_type(DRIZZLE_TYPE_VIRTUAL),
57
    is_stored(false), data_inited(false)
58
  {
59
    expr_str.str= NULL;
60
    expr_str.length= 0;
61
  };
62
  ~virtual_column_info() {}
63
  enum_field_types get_real_type()
64
  {
65
    assert(data_inited);
66
    return data_inited ? field_type : DRIZZLE_TYPE_VIRTUAL;
67
  }
68
  void set_field_type(enum_field_types fld_type)
69
  {
70
    /* Calling this function can only be done once. */
71
    assert(not data_inited);
72
    data_inited= true;
73
    field_type= fld_type;
74
  }
75
  bool get_field_stored()
76
  {
77
    assert(data_inited);
78
    return data_inited ? is_stored : true;
79
  }
80
  void set_field_stored(bool stored)
81
  {
82
    is_stored= stored;
83
  }
84
private:
85
  /*
86
    The following data is only updated by the parser and read
87
    when a Create_field object is created/initialized.
88
  */
89
  enum_field_types field_type;   /* Real field type*/
90
  bool is_stored;             /* Indication that the field is 
91
                                    phisically stored in the database*/
92
  /*
93
    This flag is used to prevent other applications from
94
    reading and using incorrect data.
95
  */
96
  bool data_inited; 
97
};
98
1 by brian
clean slate
99
class Field
100
{
101
  Field(const Item &);				/* Prevent use of these */
102
  void operator=(Field &);
103
public:
104
  static void *operator new(size_t size) {return sql_alloc(size); }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
105
  static void operator delete(void *ptr_arg __attribute__((unused)),
106
                              size_t size __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
107
  { TRASH(ptr_arg, size); }
1 by brian
clean slate
108
481 by Brian Aker
Remove all of uchar.
109
  unsigned char		*ptr;			// Position to field in record
110
  unsigned char		*null_ptr;		// Byte where null_bit is
1 by brian
clean slate
111
  /*
112
    Note that you can use table->in_use as replacement for current_thd member 
113
    only inside of val_*() and store() members (e.g. you can't use it in cons)
114
  */
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
115
  Table *table;		// Pointer for table
116
  Table *orig_table;		// Pointer to original table
1 by brian
clean slate
117
  const char	**table_name, *field_name;
118
  LEX_STRING	comment;
119
  /* Field is part of the following keys */
120
  key_map	key_start, part_of_key, part_of_key_not_clustered;
121
  key_map       part_of_sortkey;
122
  /* 
123
    We use three additional unireg types for TIMESTAMP to overcome limitation 
124
    of current binary format of .frm file. We'd like to be able to support 
125
    NOW() as default and on update value for such fields but unable to hold 
126
    this info anywhere except unireg_check field. This issue will be resolved
127
    in more clean way with transition to new text based .frm format.
128
    See also comment for Field_timestamp::Field_timestamp().
129
  */
130
  enum utype  { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
131
		CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
132
                BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD,
133
                TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD};
134
  enum imagetype { itRAW, itMBR};
135
136
  utype		unireg_check;
205 by Brian Aker
uint32 -> uin32_t
137
  uint32_t	field_length;		// Length of field
138
  uint32_t	flags;
206 by Brian Aker
Removed final uint dead types.
139
  uint16_t        field_index;            // field number in fields array
481 by Brian Aker
Remove all of uchar.
140
  unsigned char		null_bit;		// Bit used to test null bit
1 by brian
clean slate
141
  /**
142
     If true, this field was created in create_tmp_field_from_item from a NULL
143
     value. This means that the type of the field is just a guess, and the type
144
     may be freely coerced to another type.
145
146
     @see create_tmp_field_from_item
147
     @see Item_type_holder::get_real_type
148
149
   */
150
  bool is_created_from_null_item;
151
383.7.1 by Andrey Zhakov
Initial submit of code and tests
152
  /* Virtual column data */
153
  virtual_column_info *vcol_info;
154
  /*
155
    Indication that the field is phycically stored in tables 
156
    rather than just generated on SQL queries.
157
    As of now, false can only be set for generated-only virtual columns.
158
  */
159
  bool is_stored;
160
481 by Brian Aker
Remove all of uchar.
161
  Field(unsigned char *ptr_arg,uint32_t length_arg,unsigned char *null_ptr_arg,
162
        unsigned char null_bit_arg, utype unireg_check_arg,
1 by brian
clean slate
163
        const char *field_name_arg);
164
  virtual ~Field() {}
165
  /* Store functions returns 1 on overflow and -1 on fatal error */
438.1.13 by Brian Aker
uint cleanup.
166
  virtual int  store(const char *to, uint32_t length, const CHARSET_INFO * const cs)=0;
1 by brian
clean slate
167
  virtual int  store(double nr)=0;
152 by Brian Aker
longlong replacement
168
  virtual int  store(int64_t nr, bool unsigned_val)=0;
1 by brian
clean slate
169
  virtual int  store_decimal(const my_decimal *d)=0;
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
170
  virtual int store_time(DRIZZLE_TIME *ltime, enum enum_drizzle_timestamp_type t_type);
438.1.13 by Brian Aker
uint cleanup.
171
  int store(const char *to, uint32_t length, const CHARSET_INFO * const cs,
1 by brian
clean slate
172
            enum_check_fields check_level);
173
  virtual double val_real(void)=0;
152 by Brian Aker
longlong replacement
174
  virtual int64_t val_int(void)=0;
1 by brian
clean slate
175
  virtual my_decimal *val_decimal(my_decimal *);
176
  inline String *val_str(String *str) { return val_str(str, str); }
177
  /*
178
     val_str(buf1, buf2) gets two buffers and should use them as follows:
179
     if it needs a temp buffer to convert result to string - use buf1
180
       example Field_tiny::val_str()
181
     if the value exists as a string already - use buf2
241 by Brian Aker
First pass of CHAR removal.
182
       example Field_varstring::val_str() (???)
1 by brian
clean slate
183
     consequently, buf2 may be created as 'String buf;' - no memory
184
     will be allocated for it. buf1 will be allocated to hold a
185
     value if it's too small. Using allocated buffer for buf2 may result in
186
     an unnecessary free (and later, may be an alloc).
187
     This trickery is used to decrease a number of malloc calls.
188
  */
189
  virtual String *val_str(String*,String *)=0;
275 by Brian Aker
Full removal of my_bool from central server.
190
  String *val_int_as_str(String *val_buffer, bool unsigned_flag);
1 by brian
clean slate
191
  /*
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
192
   str_needs_quotes() returns true if the value returned by val_str() needs
1 by brian
clean slate
193
   to be quoted when used in constructing an SQL query.
194
  */
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
195
  virtual bool str_needs_quotes() { return false; }
1 by brian
clean slate
196
  virtual Item_result result_type () const=0;
197
  virtual Item_result cmp_type () const { return result_type(); }
198
  virtual Item_result cast_to_int_type () const { return result_type(); }
199
  static bool type_can_have_key_part(enum_field_types);
200
  static enum_field_types field_type_merge(enum_field_types, enum_field_types);
201
  static Item_result result_merge_type(enum_field_types);
202
  virtual bool eq(Field *field)
203
  {
204
    return (ptr == field->ptr && null_ptr == field->null_ptr &&
205
            null_bit == field->null_bit);
206
  }
207
  virtual bool eq_def(Field *field);
208
  
209
  /*
210
    pack_length() returns size (in bytes) used to store field data in memory
211
    (i.e. it returns the maximum size of the field in a row of the table,
212
    which is located in RAM).
213
  */
205 by Brian Aker
uint32 -> uin32_t
214
  virtual uint32_t pack_length() const { return (uint32_t) field_length; }
1 by brian
clean slate
215
216
  /*
217
    pack_length_in_rec() returns size (in bytes) used to store field data on
218
    storage (i.e. it returns the maximal size of the field in a row of the
219
    table, which is located on disk).
220
  */
205 by Brian Aker
uint32 -> uin32_t
221
  virtual uint32_t pack_length_in_rec() const { return pack_length(); }
438.1.13 by Brian Aker
uint cleanup.
222
  virtual int compatible_field_size(uint32_t field_metadata);
223
  virtual uint32_t pack_length_from_metadata(uint32_t field_metadata)
1 by brian
clean slate
224
  { return field_metadata; }
225
  /*
226
    This method is used to return the size of the data in a row-based
227
    replication row record. The default implementation of returning 0 is
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
228
    designed to allow fields that do not use metadata to return true (1)
1 by brian
clean slate
229
    from compatible_field_size() which uses this function in the comparison.
230
    The default value for field metadata for fields that do not have 
231
    metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
232
233
    Note: While most classes that override this method return pack_length(),
241 by Brian Aker
First pass of CHAR removal.
234
    the classes Field_varstring, and Field_blob return 
1 by brian
clean slate
235
    field_length + 1, field_length, and pack_length_no_ptr() respectfully.
236
  */
438.1.13 by Brian Aker
uint cleanup.
237
  virtual uint32_t row_pack_length() { return 0; }
481 by Brian Aker
Remove all of uchar.
238
  virtual int save_field_metadata(unsigned char *first_byte)
1 by brian
clean slate
239
  { return do_save_field_metadata(first_byte); }
240
241
  /*
242
    data_length() return the "real size" of the data in memory.
243
    For varstrings, this does _not_ include the length bytes.
244
  */
205 by Brian Aker
uint32 -> uin32_t
245
  virtual uint32_t data_length() { return pack_length(); }
1 by brian
clean slate
246
  /*
247
    used_length() returns the number of bytes actually used to store the data
248
    of the field. So for a varstring it includes both lenght byte(s) and
249
    string data, and anything after data_length() bytes are unused.
250
  */
205 by Brian Aker
uint32 -> uin32_t
251
  virtual uint32_t used_length() { return pack_length(); }
252
  virtual uint32_t sort_length() const { return pack_length(); }
1 by brian
clean slate
253
254
  /**
255
     Get the maximum size of the data in packed format.
256
257
     @return Maximum data length of the field when packed using the
258
     Field::pack() function.
259
   */
205 by Brian Aker
uint32 -> uin32_t
260
  virtual uint32_t max_data_length() const {
1 by brian
clean slate
261
    return pack_length();
262
  };
263
212.6.1 by Mats Kindahl
Replacing all bzero() calls with memset() calls and removing the bzero.c file.
264
  virtual int reset(void) { memset(ptr, 0, pack_length()); return 0; }
1 by brian
clean slate
265
  virtual void reset_fields() {}
266
  virtual void set_default()
267
  {
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
268
    my_ptrdiff_t l_offset= (my_ptrdiff_t) (table->getDefaultValues() - table->record[0]);
1 by brian
clean slate
269
    memcpy(ptr, ptr + l_offset, pack_length());
270
    if (null_ptr)
481 by Brian Aker
Remove all of uchar.
271
      *null_ptr= ((*null_ptr & (unsigned char) ~null_bit) | (null_ptr[l_offset] & null_bit));
1 by brian
clean slate
272
  }
273
  virtual bool binary() const { return 1; }
274
  virtual bool zero_pack() const { return 1; }
275
  virtual enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
205 by Brian Aker
uint32 -> uin32_t
276
  virtual uint32_t key_length() const { return pack_length(); }
1 by brian
clean slate
277
  virtual enum_field_types type() const =0;
278
  virtual enum_field_types real_type() const { return type(); }
481 by Brian Aker
Remove all of uchar.
279
  inline  int cmp(const unsigned char *str) { return cmp(ptr,str); }
280
  virtual int cmp_max(const unsigned char *a, const unsigned char *b,
438.1.13 by Brian Aker
uint cleanup.
281
                      uint32_t max_len __attribute__((unused)))
1 by brian
clean slate
282
    { return cmp(a, b); }
481 by Brian Aker
Remove all of uchar.
283
  virtual int cmp(const unsigned char *,const unsigned char *)=0;
284
  virtual int cmp_binary(const unsigned char *a,const unsigned char *b,
365.2.5 by Monty Taylor
More ~0 removal.
285
                         uint32_t  __attribute__((unused)) max_length=UINT32_MAX)
1 by brian
clean slate
286
  { return memcmp(a,b,pack_length()); }
438.1.13 by Brian Aker
uint cleanup.
287
  virtual int cmp_offset(uint32_t row_offset)
1 by brian
clean slate
288
  { return cmp(ptr,ptr+row_offset); }
438.1.13 by Brian Aker
uint cleanup.
289
  virtual int cmp_binary_offset(uint32_t row_offset)
1 by brian
clean slate
290
  { return cmp_binary(ptr, ptr+row_offset); };
481 by Brian Aker
Remove all of uchar.
291
  virtual int key_cmp(const unsigned char *a,const unsigned char *b)
1 by brian
clean slate
292
  { return cmp(a, b); }
481 by Brian Aker
Remove all of uchar.
293
  virtual int key_cmp(const unsigned char *str, uint32_t length __attribute__((unused)))
1 by brian
clean slate
294
  { return cmp(ptr,str); }
438.1.13 by Brian Aker
uint cleanup.
295
  virtual uint32_t decimals() const { return 0; }
1 by brian
clean slate
296
  /*
297
    Caller beware: sql_type can change str.Ptr, so check
298
    ptr() to see if it changed if you are using your own buffer
299
    in str and restore it with set() if needed
300
  */
301
  virtual void sql_type(String &str) const =0;
438.1.13 by Brian Aker
uint cleanup.
302
  virtual uint32_t size_of() const =0;		// For new field
1 by brian
clean slate
303
  inline bool is_null(my_ptrdiff_t row_offset= 0)
304
  { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : table->null_row; }
305
  inline bool is_real_null(my_ptrdiff_t row_offset= 0)
306
    { return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; }
481 by Brian Aker
Remove all of uchar.
307
  inline bool is_null_in_record(const unsigned char *record)
1 by brian
clean slate
308
  {
309
    if (!null_ptr)
310
      return 0;
438.1.13 by Brian Aker
uint cleanup.
311
    return test(record[(uint32_t) (null_ptr -table->record[0])] &
1 by brian
clean slate
312
		null_bit);
313
  }
314
  inline bool is_null_in_record_with_offset(my_ptrdiff_t offset)
315
  {
316
    if (!null_ptr)
317
      return 0;
318
    return test(null_ptr[offset] & null_bit);
319
  }
320
  inline void set_null(my_ptrdiff_t row_offset= 0)
321
    { if (null_ptr) null_ptr[row_offset]|= null_bit; }
322
  inline void set_notnull(my_ptrdiff_t row_offset= 0)
481 by Brian Aker
Remove all of uchar.
323
    { if (null_ptr) null_ptr[row_offset]&= (unsigned char) ~null_bit; }
1 by brian
clean slate
324
  inline bool maybe_null(void) { return null_ptr != 0 || table->maybe_null; }
325
  inline bool real_maybe_null(void) { return null_ptr != 0; }
326
327
  enum {
328
    LAST_NULL_BYTE_UNDEF= 0
329
  };
330
331
  /*
332
    Find the position of the last null byte for the field.
333
334
    SYNOPSIS
335
      last_null_byte()
336
337
    DESCRIPTION
338
      Return a pointer to the last byte of the null bytes where the
339
      field conceptually is placed.
340
341
    RETURN VALUE
342
      The position of the last null byte relative to the beginning of
343
      the record. If the field does not use any bits of the null
344
      bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned.
345
   */
346
  size_t last_null_byte() const {
347
    size_t bytes= do_last_null_byte();
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
348
    assert(bytes <= table->getNullBytes());
1 by brian
clean slate
349
    return bytes;
350
  }
351
352
  virtual void make_field(Send_field *);
481 by Brian Aker
Remove all of uchar.
353
  virtual void sort_string(unsigned char *buff,uint32_t length)=0;
438.1.13 by Brian Aker
uint cleanup.
354
  virtual bool optimize_range(uint32_t idx, uint32_t part);
1 by brian
clean slate
355
  /*
356
    This should be true for fields which, when compared with constant
152 by Brian Aker
longlong replacement
357
    items, can be casted to int64_t. In this case we will at 'fix_fields'
358
    stage cast the constant items to int64_ts and at the execution stage
1 by brian
clean slate
359
    use field->val_int() for comparison.  Used to optimize clauses like
360
    'a_column BETWEEN date_const, date_const'.
361
  */
152 by Brian Aker
longlong replacement
362
  virtual bool can_be_compared_as_int64_t() const { return false; }
1 by brian
clean slate
363
  virtual void free() {}
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
364
  virtual Field *new_field(MEM_ROOT *root, Table *new_table,
1 by brian
clean slate
365
                           bool keep_type);
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
366
  virtual Field *new_key_field(MEM_ROOT *root, Table *new_table,
481 by Brian Aker
Remove all of uchar.
367
                               unsigned char *new_ptr, unsigned char *new_null_ptr,
438.1.13 by Brian Aker
uint cleanup.
368
                               uint32_t new_null_bit);
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
369
  Field *clone(MEM_ROOT *mem_root, Table *new_table);
481 by Brian Aker
Remove all of uchar.
370
  inline void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
1 by brian
clean slate
371
  {
372
    ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
373
  }
481 by Brian Aker
Remove all of uchar.
374
  inline void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
1 by brian
clean slate
375
  virtual void move_field_offset(my_ptrdiff_t ptr_diff)
376
  {
481 by Brian Aker
Remove all of uchar.
377
    ptr=ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
1 by brian
clean slate
378
    if (null_ptr)
481 by Brian Aker
Remove all of uchar.
379
      null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
1 by brian
clean slate
380
  }
481 by Brian Aker
Remove all of uchar.
381
  virtual void get_image(unsigned char *buff, uint32_t length,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
382
                         const CHARSET_INFO * const cs __attribute__((unused)))
1 by brian
clean slate
383
    { memcpy(buff,ptr,length); }
481 by Brian Aker
Remove all of uchar.
384
  virtual void set_image(const unsigned char *buff,uint32_t length,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
385
                         const CHARSET_INFO * const cs __attribute__((unused)))
1 by brian
clean slate
386
    { memcpy(ptr,buff,length); }
387
388
389
  /*
390
    Copy a field part into an output buffer.
391
392
    SYNOPSIS
393
      Field::get_key_image()
394
      buff   [out] output buffer
395
      length       output buffer size
396
      type         itMBR for geometry blobs, otherwise itRAW
397
398
    DESCRIPTION
399
      This function makes a copy of field part of size equal to or
400
      less than "length" parameter value.
401
      For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
402
      is padded by zero byte.
403
404
    NOTES
405
      For variable length character fields (i.e. UTF-8) the "length"
406
      parameter means a number of output buffer bytes as if all field
407
      characters have maximal possible size (mbmaxlen). In the other words,
408
      "length" parameter is a number of characters multiplied by
409
      field_charset->mbmaxlen.
410
411
    RETURN
412
      Number of copied bytes (excluding padded zero bytes -- see above).
413
  */
414
481 by Brian Aker
Remove all of uchar.
415
  virtual uint32_t get_key_image(unsigned char *buff, uint32_t length,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
416
                             imagetype type __attribute__((unused)))
1 by brian
clean slate
417
  {
418
    get_image(buff, length, &my_charset_bin);
419
    return length;
420
  }
481 by Brian Aker
Remove all of uchar.
421
  virtual void set_key_image(const unsigned char *buff,uint32_t length)
1 by brian
clean slate
422
    { set_image(buff,length, &my_charset_bin); }
438.1.13 by Brian Aker
uint cleanup.
423
  inline int64_t val_int_offset(uint32_t row_offset)
1 by brian
clean slate
424
    {
425
      ptr+=row_offset;
152 by Brian Aker
longlong replacement
426
      int64_t tmp=val_int();
1 by brian
clean slate
427
      ptr-=row_offset;
428
      return tmp;
429
    }
481 by Brian Aker
Remove all of uchar.
430
  inline int64_t val_int(const unsigned char *new_ptr)
1 by brian
clean slate
431
  {
481 by Brian Aker
Remove all of uchar.
432
    unsigned char *old_ptr= ptr;
152 by Brian Aker
longlong replacement
433
    int64_t return_value;
481 by Brian Aker
Remove all of uchar.
434
    ptr= (unsigned char*) new_ptr;
1 by brian
clean slate
435
    return_value= val_int();
436
    ptr= old_ptr;
437
    return return_value;
438
  }
481 by Brian Aker
Remove all of uchar.
439
  inline String *val_str(String *str, const unsigned char *new_ptr)
1 by brian
clean slate
440
  {
481 by Brian Aker
Remove all of uchar.
441
    unsigned char *old_ptr= ptr;
442
    ptr= (unsigned char*) new_ptr;
1 by brian
clean slate
443
    val_str(str);
444
    ptr= old_ptr;
445
    return str;
446
  }
447
  virtual bool send_binary(Protocol *protocol);
448
481 by Brian Aker
Remove all of uchar.
449
  virtual unsigned char *pack(unsigned char *to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
450
                      uint32_t max_length, bool low_byte_first);
1 by brian
clean slate
451
  /**
481 by Brian Aker
Remove all of uchar.
452
     @overload Field::pack(unsigned char*, const unsigned char*, uint32_t, bool)
1 by brian
clean slate
453
  */
481 by Brian Aker
Remove all of uchar.
454
  unsigned char *pack(unsigned char *to, const unsigned char *from)
1 by brian
clean slate
455
  {
481 by Brian Aker
Remove all of uchar.
456
    unsigned char *result= this->pack(to, from, UINT_MAX, table->s->db_low_byte_first);
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
457
    return(result);
1 by brian
clean slate
458
  }
459
481 by Brian Aker
Remove all of uchar.
460
  virtual const unsigned char *unpack(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
461
                              uint32_t param_data, bool low_byte_first);
1 by brian
clean slate
462
  /**
481 by Brian Aker
Remove all of uchar.
463
     @overload Field::unpack(unsigned char*, const unsigned char*, uint32_t, bool)
1 by brian
clean slate
464
  */
481 by Brian Aker
Remove all of uchar.
465
  const unsigned char *unpack(unsigned char* to, const unsigned char *from)
1 by brian
clean slate
466
  {
481 by Brian Aker
Remove all of uchar.
467
    const unsigned char *result= unpack(to, from, 0U, table->s->db_low_byte_first);
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
468
    return(result);
1 by brian
clean slate
469
  }
470
481 by Brian Aker
Remove all of uchar.
471
  virtual unsigned char *pack_key(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
472
                          uint32_t max_length, bool low_byte_first)
1 by brian
clean slate
473
  {
474
    return pack(to, from, max_length, low_byte_first);
475
  }
481 by Brian Aker
Remove all of uchar.
476
  virtual unsigned char *pack_key_from_key_image(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
477
					uint32_t max_length, bool low_byte_first)
1 by brian
clean slate
478
  {
479
    return pack(to, from, max_length, low_byte_first);
480
  }
481 by Brian Aker
Remove all of uchar.
481
  virtual const unsigned char *unpack_key(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
482
                                  uint32_t max_length, bool low_byte_first)
1 by brian
clean slate
483
  {
484
    return unpack(to, from, max_length, low_byte_first);
485
  }
481 by Brian Aker
Remove all of uchar.
486
  virtual uint32_t packed_col_length(const unsigned char *to __attribute__((unused)),
438.1.13 by Brian Aker
uint cleanup.
487
                                 uint32_t length)
1 by brian
clean slate
488
  { return length;}
438.1.13 by Brian Aker
uint cleanup.
489
  virtual uint32_t max_packed_col_length(uint32_t max_length)
1 by brian
clean slate
490
  { return max_length;}
491
481 by Brian Aker
Remove all of uchar.
492
  virtual int pack_cmp(const unsigned char *a,const unsigned char *b,
438.1.13 by Brian Aker
uint cleanup.
493
                       uint32_t key_length_arg __attribute__((unused)),
275 by Brian Aker
Full removal of my_bool from central server.
494
                       bool insert_or_update __attribute__((unused)))
1 by brian
clean slate
495
  { return cmp(a,b); }
481 by Brian Aker
Remove all of uchar.
496
  virtual int pack_cmp(const unsigned char *b,
438.1.13 by Brian Aker
uint cleanup.
497
                       uint32_t key_length_arg __attribute__((unused)),
275 by Brian Aker
Full removal of my_bool from central server.
498
                       bool insert_or_update __attribute__((unused)))
1 by brian
clean slate
499
  { return cmp(ptr,b); }
481 by Brian Aker
Remove all of uchar.
500
  uint32_t offset(unsigned char *record)
1 by brian
clean slate
501
  {
438.1.13 by Brian Aker
uint cleanup.
502
    return (uint32_t) (ptr - record);
1 by brian
clean slate
503
  }
504
  void copy_from_tmp(int offset);
438.1.13 by Brian Aker
uint cleanup.
505
  uint32_t fill_cache_field(struct st_cache_field *copy);
506
  virtual bool get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate);
236.1.24 by Monty Taylor
Renamed MYSQL_TIME to DRIZZLE_TIME.
507
  virtual bool get_time(DRIZZLE_TIME *ltime);
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
508
  virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
509
  virtual const CHARSET_INFO *sort_charset(void) const { return charset(); }
51.1.58 by Jay Pipes
Replace/remove DBUG and standardize TRUE/FALSE. Remove ASSERT_COLUMN_XXX macros, that work will be done on another
510
  virtual bool has_charset(void) const { return false; }
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
511
  virtual void set_charset(const CHARSET_INFO * const charset_arg __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
512
  { }
1 by brian
clean slate
513
  virtual enum Derivation derivation(void) const
514
  { return DERIVATION_IMPLICIT; }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
515
  virtual void set_derivation(enum Derivation derivation_arg __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
516
  { }
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
517
  bool set_warning(DRIZZLE_ERROR::enum_warning_level, unsigned int code,
1 by brian
clean slate
518
                   int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
519
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code, 
520
                            const char *str, uint32_t str_len,
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
521
                            enum enum_drizzle_timestamp_type ts_type, int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
522
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code, 
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
523
                            int64_t nr, enum enum_drizzle_timestamp_type ts_type,
1 by brian
clean slate
524
                            int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
525
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, const uint32_t code, 
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
526
                            double nr, enum enum_drizzle_timestamp_type ts_type);
1 by brian
clean slate
527
  inline bool check_overflow(int op_result)
528
  {
529
    return (op_result == E_DEC_OVERFLOW);
530
  }
531
  int warn_if_overflow(int op_result);
327.1.5 by Brian Aker
Refactor around classes. TABLE_LIST has been factored out of table.h
532
  void init(Table *table_arg)
1 by brian
clean slate
533
  {
534
    orig_table= table= table_arg;
535
    table_name= &table_arg->alias;
536
  }
537
538
  /* maximum possible display length */
205 by Brian Aker
uint32 -> uin32_t
539
  virtual uint32_t max_display_length()= 0;
1 by brian
clean slate
540
438.1.13 by Brian Aker
uint cleanup.
541
  virtual uint32_t is_equal(Create_field *new_field);
152 by Brian Aker
longlong replacement
542
  /* convert decimal to int64_t with overflow check */
543
  int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
1 by brian
clean slate
544
                                    int *err);
545
  /* The max. number of characters */
205 by Brian Aker
uint32 -> uin32_t
546
  inline uint32_t char_length() const
1 by brian
clean slate
547
  {
548
    return field_length / charset()->mbmaxlen;
549
  }
550
551
  inline enum column_format_type column_format() const
552
  {
553
    return (enum column_format_type)
554
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
555
  }
556
557
  /* Hash value */
290 by Brian Aker
Update for ulong change over.
558
  virtual void hash(uint32_t *nr, uint32_t *nr2);
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
559
  friend bool reopen_table(THD *,Table *,bool);
438.1.13 by Brian Aker
uint cleanup.
560
  friend int cre_myisam(char * name, register Table *form, uint32_t options,
1 by brian
clean slate
561
			uint64_t auto_increment_value);
562
  friend class Copy_field;
563
  friend class Item_avg_field;
564
  friend class Item_std_field;
565
  friend class Item_sum_num;
566
  friend class Item_sum_sum;
567
  friend class Item_sum_str;
568
  friend class Item_sum_count;
569
  friend class Item_sum_avg;
570
  friend class Item_sum_std;
571
  friend class Item_sum_min;
572
  friend class Item_sum_max;
573
  friend class Item_func_group_concat;
574
575
private:
576
  /*
577
    Primitive for implementing last_null_byte().
578
579
    SYNOPSIS
580
      do_last_null_byte()
581
582
    DESCRIPTION
583
      Primitive for the implementation of the last_null_byte()
584
      function. This represents the inheritance interface and can be
585
      overridden by subclasses.
586
   */
587
  virtual size_t do_last_null_byte() const;
588
589
/**
590
   Retrieve the field metadata for fields.
591
592
   This default implementation returns 0 and saves 0 in the metadata_ptr
593
   value.
594
595
   @param   metadata_ptr   First byte of field metadata
596
597
   @returns 0 no bytes written.
598
*/
481 by Brian Aker
Remove all of uchar.
599
  virtual int do_save_field_metadata(unsigned char *metadata_ptr __attribute__((unused)))
1 by brian
clean slate
600
  { return 0; }
601
};
602
603
/*
604
  Create field class for CREATE TABLE
605
*/
606
607
class Create_field :public Sql_alloc
608
{
609
public:
610
  const char *field_name;
611
  const char *change;			// If done with alter table
612
  const char *after;			// Put column after this one
613
  LEX_STRING comment;			// Comment for field
614
  Item	*def;				// Default value
615
  enum	enum_field_types sql_type;
616
  /*
617
    At various stages in execution this can be length of field in bytes or
618
    max number of characters. 
619
  */
290 by Brian Aker
Update for ulong change over.
620
  uint32_t length;
1 by brian
clean slate
621
  /*
622
    The value of `length' as set by parser: is the number of characters
623
    for most of the types, or of bytes for BLOBs or numeric types.
624
  */
205 by Brian Aker
uint32 -> uin32_t
625
  uint32_t char_length;
438.1.13 by Brian Aker
uint cleanup.
626
  uint32_t  decimals, flags, pack_length, key_length;
1 by brian
clean slate
627
  Field::utype unireg_check;
628
  TYPELIB *interval;			// Which interval to use
629
  TYPELIB *save_interval;               // Temporary copy for the above
630
                                        // Used only for UCS2 intervals
631
  List<String> interval_list;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
632
  const CHARSET_INFO *charset;
1 by brian
clean slate
633
  Field *field;				// For alter table
634
206 by Brian Aker
Removed final uint dead types.
635
  uint8_t row,col,sc_length,interval_id;	// For rea_create_table
438.1.13 by Brian Aker
uint cleanup.
636
  uint32_t	offset,pack_flag;
383.7.1 by Andrey Zhakov
Initial submit of code and tests
637
638
  /* Virtual column expression statement */
639
  virtual_column_info *vcol_info;
640
  /*
641
    Indication that the field is phycically stored in tables 
642
    rather than just generated on SQL queries.
643
    As of now, FALSE can only be set for generated-only virtual columns.
644
  */
645
  bool is_stored;
646
1 by brian
clean slate
647
  Create_field() :after(0) {}
648
  Create_field(Field *field, Field *orig_field);
649
  /* Used to make a clone of this object for ALTER/CREATE TABLE */
650
  Create_field *clone(MEM_ROOT *mem_root) const
651
    { return new (mem_root) Create_field(*this); }
652
  void create_length_to_internal_length(void);
653
654
  inline enum column_format_type column_format() const
655
  {
656
    return (enum column_format_type)
657
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
658
  }
659
660
  /* Init for a tmp table field. To be extended if need be. */
661
  void init_for_tmp_table(enum_field_types sql_type_arg,
205 by Brian Aker
uint32 -> uin32_t
662
                          uint32_t max_length, uint32_t decimals,
1 by brian
clean slate
663
                          bool maybe_null, bool is_unsigned);
664
665
  bool init(THD *thd, char *field_name, enum_field_types type, char *length,
438.1.13 by Brian Aker
uint cleanup.
666
            char *decimals, uint32_t type_modifier, Item *default_value,
1 by brian
clean slate
667
            Item *on_update_value, LEX_STRING *comment, char *change,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
668
            List<String> *interval_list, const CHARSET_INFO * const cs,
438.1.13 by Brian Aker
uint cleanup.
669
            uint32_t uint_geom_type,
383.7.1 by Andrey Zhakov
Initial submit of code and tests
670
            enum column_format_type column_format,
671
            virtual_column_info *vcol_info);
1 by brian
clean slate
672
};
673
674
675
/*
676
  A class for sending info to the client
677
*/
678
679
class Send_field {
680
 public:
681
  const char *db_name;
682
  const char *table_name,*org_table_name;
683
  const char *col_name,*org_col_name;
290 by Brian Aker
Update for ulong change over.
684
  uint32_t length;
438.1.13 by Brian Aker
uint cleanup.
685
  uint32_t charsetnr, flags, decimals;
1 by brian
clean slate
686
  enum_field_types type;
687
  Send_field() {}
688
};
689
690
691
/*
692
  A class for quick copying data to fields
693
*/
694
695
class Copy_field :public Sql_alloc {
696
  /**
697
    Convenience definition of a copy function returned by
698
    get_copy_func.
699
  */
700
  typedef void Copy_func(Copy_field*);
701
  Copy_func *get_copy_func(Field *to, Field *from);
702
public:
481 by Brian Aker
Remove all of uchar.
703
  unsigned char *from_ptr,*to_ptr;
704
  unsigned char *from_null_ptr,*to_null_ptr;
274 by Brian Aker
my_bool conversion in Table
705
  bool *null_row;
438.1.13 by Brian Aker
uint cleanup.
706
  uint32_t	from_bit,to_bit;
707
  uint32_t from_length,to_length;
1 by brian
clean slate
708
  Field *from_field,*to_field;
709
  String tmp;					// For items
710
711
  Copy_field() {}
712
  ~Copy_field() {}
713
  void set(Field *to,Field *from,bool save);	// Field to field 
481 by Brian Aker
Remove all of uchar.
714
  void set(unsigned char *to,Field *from);		// Field to string
1 by brian
clean slate
715
  void (*do_copy)(Copy_field *);
716
  void (*do_copy2)(Copy_field *);		// Used to handle null values
717
};
718
719
481 by Brian Aker
Remove all of uchar.
720
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
721
		  unsigned char *null_pos, unsigned char null_bit,
438.1.13 by Brian Aker
uint cleanup.
722
		  uint32_t pack_flag, enum_field_types field_type,
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
723
		  const CHARSET_INFO * cs,
1 by brian
clean slate
724
		  Field::utype unireg_check,
725
		  TYPELIB *interval, const char *field_name);
438.1.13 by Brian Aker
uint cleanup.
726
uint32_t pack_length_to_packflag(uint32_t type);
290 by Brian Aker
Update for ulong change over.
727
enum_field_types get_blob_type_from_length(uint32_t length);
205 by Brian Aker
uint32 -> uin32_t
728
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
1 by brian
clean slate
729
int set_field_to_null(Field *field);
730
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
731
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
732
483.1.4 by Lee
break out Field_longstr
733
bool
734
test_if_important_data(const CHARSET_INFO * const cs, 
735
		       const char *str,
736
                       const char *strend);
737
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
738
/*
739
  Field subclasses
740
 */
483.1.5 by Lee
clean up code for Field_str
741
#include <drizzled/field/str.h>
483.1.4 by Lee
break out Field_longstr
742
#include <drizzled/field/longstr.h>
483.1.6 by Lee
code clean up for Field_num
743
#include <drizzled/field/num.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
744
#include <drizzled/field/blob.h>
438.4.1 by Lee
breaking out enum field classes
745
#include <drizzled/field/enum.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
746
#include <drizzled/field/null.h>
747
#include <drizzled/field/date.h>
748
#include <drizzled/field/fdecimal.h>
483.1.1 by Lee
latest code cleanup for Field_real
749
#include <drizzled/field/real.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
750
#include <drizzled/field/double.h>
751
#include <drizzled/field/long.h>
752
#include <drizzled/field/int64_t.h>
483.1.6 by Lee
code clean up for Field_num
753
#include <drizzled/field/num.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
754
#include <drizzled/field/timetype.h>
755
#include <drizzled/field/timestamp.h>
756
#include <drizzled/field/datetime.h>
757
#include <drizzled/field/fstring.h>
758
#include <drizzled/field/varstring.h>
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
759
1 by brian
clean slate
760
/*
761
  The following are for the interface with the .frm file
762
*/
763
764
#define FIELDFLAG_DECIMAL		1
765
#define FIELDFLAG_BINARY		1	// Shares same flag
766
#define FIELDFLAG_NUMBER		2
216 by Brian Aker
Remove completely ZEROFILL
767
#define FIELDFLAG_DECIMAL_POSITION      4
1 by brian
clean slate
768
#define FIELDFLAG_PACK			120	// Bits used for packing
769
#define FIELDFLAG_INTERVAL		256     // mangled with decimals!
770
#define FIELDFLAG_BITFIELD		512	// mangled with decimals!
771
#define FIELDFLAG_BLOB			1024	// mangled with decimals!
772
#define FIELDFLAG_GEOM			2048    // mangled with decimals!
773
774
#define FIELDFLAG_TREAT_BIT_AS_CHAR     4096    /* use Field_bit_as_char */
775
776
#define FIELDFLAG_LEFT_FULLSCREEN	8192
777
#define FIELDFLAG_RIGHT_FULLSCREEN	16384
778
#define FIELDFLAG_FORMAT_NUMBER		16384	// predit: ###,,## in output
779
#define FIELDFLAG_NO_DEFAULT		16384   /* sql */
438.1.13 by Brian Aker
uint cleanup.
780
#define FIELDFLAG_SUM			((uint32_t) 32768)// predit: +#fieldflag
781
#define FIELDFLAG_MAYBE_NULL		((uint32_t) 32768)// sql
782
#define FIELDFLAG_HEX_ESCAPE		((uint32_t) 0x10000)
1 by brian
clean slate
783
#define FIELDFLAG_PACK_SHIFT		3
784
#define FIELDFLAG_DEC_SHIFT		8
785
#define FIELDFLAG_MAX_DEC		31
786
#define FIELDFLAG_NUM_SCREEN_TYPE	0x7F01
787
#define FIELDFLAG_ALFA_SCREEN_TYPE	0x7800
788
789
#define MTYP_TYPENR(type) (type & 127)	/* Remove bits from type */
790
791
#define f_is_dec(x)		((x) & FIELDFLAG_DECIMAL)
792
#define f_is_num(x)		((x) & FIELDFLAG_NUMBER)
216 by Brian Aker
Remove completely ZEROFILL
793
#define f_is_decimal_precision(x)	((x) & FIELDFLAG_DECIMAL_POSITION)
1 by brian
clean slate
794
#define f_is_packed(x)		((x) & FIELDFLAG_PACK)
795
#define f_packtype(x)		(((x) >> FIELDFLAG_PACK_SHIFT) & 15)
206 by Brian Aker
Removed final uint dead types.
796
#define f_decimals(x)		((uint8_t) (((x) >> FIELDFLAG_DEC_SHIFT) & FIELDFLAG_MAX_DEC))
1 by brian
clean slate
797
#define f_is_alpha(x)		(!f_is_num(x))
798
#define f_is_binary(x)          ((x) & FIELDFLAG_BINARY) // 4.0- compatibility
799
#define f_is_enum(x)            (((x) & (FIELDFLAG_INTERVAL | FIELDFLAG_NUMBER)) == FIELDFLAG_INTERVAL)
800
#define f_is_bitfield(x)        (((x) & (FIELDFLAG_BITFIELD | FIELDFLAG_NUMBER)) == FIELDFLAG_BITFIELD)
801
#define f_is_blob(x)		(((x) & (FIELDFLAG_BLOB | FIELDFLAG_NUMBER)) == FIELDFLAG_BLOB)
802
#define f_is_equ(x)		((x) & (1+2+FIELDFLAG_PACK+31*256))
803
#define f_settype(x)		(((int) x) << FIELDFLAG_PACK_SHIFT)
804
#define f_maybe_null(x)		(x & FIELDFLAG_MAYBE_NULL)
805
#define f_no_default(x)		(x & FIELDFLAG_NO_DEFAULT)
806
#define f_bit_as_char(x)        ((x) & FIELDFLAG_TREAT_BIT_AS_CHAR)
807
#define f_is_hex_escape(x)      ((x) & FIELDFLAG_HEX_ESCAPE)
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
808
483.1.5 by Lee
clean up code for Field_str
809
bool
810
check_string_copy_error(Field_str *field,
811
                        const char *well_formed_error_pos,
812
                        const char *cannot_convert_error_pos,
813
                        const char *end,
814
                        const CHARSET_INFO * const cs);
483.1.6 by Lee
code clean up for Field_num
815
816
817
class Field_tiny :public Field_num {
818
public:
819
  Field_tiny(unsigned char *ptr_arg, uint32_t len_arg, unsigned char *null_ptr_arg,
820
	     unsigned char null_bit_arg,
821
	     enum utype unireg_check_arg, const char *field_name_arg,
822
	     bool zero_arg, bool unsigned_arg)
823
    :Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
824
	       unireg_check_arg, field_name_arg,
825
	       0, zero_arg,unsigned_arg)
826
    {}
827
  enum Item_result result_type () const { return INT_RESULT; }
828
  enum_field_types type() const { return DRIZZLE_TYPE_TINY;}
829
  enum ha_base_keytype key_type() const
830
    { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
831
  int store(const char *to,uint32_t length, const CHARSET_INFO * const charset);
832
  int store(double nr);
833
  int store(int64_t nr, bool unsigned_val);
834
  int reset(void) { ptr[0]=0; return 0; }
835
  double val_real(void);
836
  int64_t val_int(void);
837
  String *val_str(String*,String *);
838
  bool send_binary(Protocol *protocol);
839
  int cmp(const unsigned char *,const unsigned char *);
840
  void sort_string(unsigned char *buff,uint32_t length);
841
  uint32_t pack_length() const { return 1; }
842
  void sql_type(String &str) const;
843
  uint32_t max_display_length() { return 4; }
844
845
  virtual unsigned char *pack(unsigned char* to, const unsigned char *from,
846
                      uint32_t max_length __attribute__((unused)),
847
                      bool low_byte_first __attribute__((unused)))
848
  {
849
    *to= *from;
850
    return to + 1;
851
  }
852
853
  virtual const unsigned char *unpack(unsigned char* to, const unsigned char *from,
854
                              uint32_t param_data __attribute__((unused)),
855
                              bool low_byte_first __attribute__((unused)))
856
  {
857
    *to= *from;
858
    return from + 1;
859
  }
860
};