~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
520.8.2 by Monty Taylor
Moved sql_parse.h and sql_error.h out of common_includes.
25
#ifndef DRIZZLED_FIELD_H
26
#define DRIZZLED_FIELD_H
27
28
#include <drizzled/sql_error.h>
520.8.3 by Monty Taylor
Moved hash back to mysys.
29
#include <drizzled/my_decimal.h>
993.1.9 by Padraig O'Sullivan
Cleaning some header file includes after removing my_bitmap.h.
30
#include <drizzled/key_map.h>
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
31
#include <drizzled/sql_bitmap.h>
32
#include <drizzled/sql_list.h>
801.1.2 by Brian Aker
Short global cleanup for includes.
33
/* System-wide common data structures */
34
#include <drizzled/structs.h>
656.1.1 by Monty Taylor
OOOh doggie. Got rid of my_alloca.
35
#include <string>
1 by brian
clean slate
36
37
#define DATETIME_DEC                     6
173.1.9 by Toru Maesaka
ripped out DOUBLE and moved to field/
38
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
39
205 by Brian Aker
uint32 -> uin32_t
40
const uint32_t max_field_size= (uint32_t) 4294967295U;
1 by brian
clean slate
41
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
42
class Table;
1 by brian
clean slate
43
class Send_field;
44
class Protocol;
45
class Create_field;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
46
class virtual_column_info;
47
1000.1.3 by Brian Aker
Renamed TABLE_SHARE to TableShare
48
class TableShare;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
49
798.2.29 by Brian Aker
Detangle more of the session object
50
class Field;
51
1 by brian
clean slate
52
struct st_cache_field;
53
int field_conv(Field *to,Field *from);
54
438.1.13 by Brian Aker
uint cleanup.
55
inline uint32_t get_enum_pack_length(int elements)
1 by brian
clean slate
56
{
57
  return elements < 256 ? 1 : 2;
58
}
59
60
class Field
61
{
62
  Field(const Item &);				/* Prevent use of these */
63
  void operator=(Field &);
64
public:
65
  static void *operator new(size_t size) {return sql_alloc(size); }
896.3.6 by Stewart Smith
Read Fields out of proto instead of FRM.
66
  static void *operator new(size_t size, MEM_ROOT *mem_root)
67
  { return (void*) alloc_root(mem_root, (uint32_t) size); }
68
644 by Brian Aker
Clean up warnings for Solaris.
69
  static void operator delete(void *, size_t)
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
70
  { TRASH(ptr_arg, size); }
1 by brian
clean slate
71
481 by Brian Aker
Remove all of uchar.
72
  unsigned char		*ptr;			// Position to field in record
73
  unsigned char		*null_ptr;		// Byte where null_bit is
1 by brian
clean slate
74
  /*
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
75
    Note that you can use table->in_use as replacement for current_session member
1 by brian
clean slate
76
    only inside of val_*() and store() members (e.g. you can't use it in cons)
77
  */
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
78
  Table *table;		// Pointer for table
79
  Table *orig_table;		// Pointer to original table
1 by brian
clean slate
80
  const char	**table_name, *field_name;
81
  LEX_STRING	comment;
82
  /* Field is part of the following keys */
83
  key_map	key_start, part_of_key, part_of_key_not_clustered;
84
  key_map       part_of_sortkey;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
85
  /*
86
    We use three additional unireg types for TIMESTAMP to overcome limitation
87
    of current binary format of .frm file. We'd like to be able to support
88
    NOW() as default and on update value for such fields but unable to hold
1 by brian
clean slate
89
    this info anywhere except unireg_check field. This issue will be resolved
90
    in more clean way with transition to new text based .frm format.
91
    See also comment for Field_timestamp::Field_timestamp().
92
  */
869.2.5 by Stewart Smith
DATE and UNKNOWN unireg_type bite the dust. eww... gritty.
93
  enum utype  { NONE,
94
                NEXT_NUMBER,
869.2.4 by Stewart Smith
Remove the last bit of BIT_FIELD
95
                TIMESTAMP_OLD_FIELD,
1 by brian
clean slate
96
                TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD};
97
  enum imagetype { itRAW, itMBR};
98
99
  utype		unireg_check;
205 by Brian Aker
uint32 -> uin32_t
100
  uint32_t	field_length;		// Length of field
101
  uint32_t	flags;
206 by Brian Aker
Removed final uint dead types.
102
  uint16_t        field_index;            // field number in fields array
481 by Brian Aker
Remove all of uchar.
103
  unsigned char		null_bit;		// Bit used to test null bit
1 by brian
clean slate
104
  /**
105
     If true, this field was created in create_tmp_field_from_item from a NULL
106
     value. This means that the type of the field is just a guess, and the type
107
     may be freely coerced to another type.
108
109
     @see create_tmp_field_from_item
110
     @see Item_type_holder::get_real_type
111
112
   */
113
  bool is_created_from_null_item;
114
481 by Brian Aker
Remove all of uchar.
115
  Field(unsigned char *ptr_arg,uint32_t length_arg,unsigned char *null_ptr_arg,
116
        unsigned char null_bit_arg, utype unireg_check_arg,
1 by brian
clean slate
117
        const char *field_name_arg);
118
  virtual ~Field() {}
119
  /* Store functions returns 1 on overflow and -1 on fatal error */
779.3.18 by Monty Taylor
Cleaned up warnings up through innodb.
120
  virtual int store(const char *to, uint32_t length,
121
                    const CHARSET_INFO * const cs)=0;
122
  virtual int store(double nr)=0;
123
  virtual int store(int64_t nr, bool unsigned_val)=0;
124
  virtual int store_decimal(const my_decimal *d)=0;
125
  int store(const char *to, uint32_t length,
126
            const CHARSET_INFO * const cs,
127
            enum_check_fields check_level);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
128
  virtual int store_time(DRIZZLE_TIME *ltime,
129
                         enum enum_drizzle_timestamp_type t_type);
1 by brian
clean slate
130
  virtual double val_real(void)=0;
152 by Brian Aker
longlong replacement
131
  virtual int64_t val_int(void)=0;
1 by brian
clean slate
132
  virtual my_decimal *val_decimal(my_decimal *);
133
  inline String *val_str(String *str) { return val_str(str, str); }
134
  /*
135
     val_str(buf1, buf2) gets two buffers and should use them as follows:
136
     if it needs a temp buffer to convert result to string - use buf1
137
       example Field_tiny::val_str()
138
     if the value exists as a string already - use buf2
241 by Brian Aker
First pass of CHAR removal.
139
       example Field_varstring::val_str() (???)
1 by brian
clean slate
140
     consequently, buf2 may be created as 'String buf;' - no memory
141
     will be allocated for it. buf1 will be allocated to hold a
142
     value if it's too small. Using allocated buffer for buf2 may result in
143
     an unnecessary free (and later, may be an alloc).
144
     This trickery is used to decrease a number of malloc calls.
145
  */
146
  virtual String *val_str(String*,String *)=0;
275 by Brian Aker
Full removal of my_bool from central server.
147
  String *val_int_as_str(String *val_buffer, bool unsigned_flag);
1 by brian
clean slate
148
  /*
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
149
   str_needs_quotes() returns true if the value returned by val_str() needs
1 by brian
clean slate
150
   to be quoted when used in constructing an SQL query.
151
  */
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
152
  virtual bool str_needs_quotes() { return false; }
1 by brian
clean slate
153
  virtual Item_result result_type () const=0;
154
  virtual Item_result cmp_type () const { return result_type(); }
155
  virtual Item_result cast_to_int_type () const { return result_type(); }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
156
  /**
157
     Check whether a field type can be partially indexed by a key.
158
159
     This is a static method, rather than a virtual function, because we need
160
     to check the type of a non-Field in mysql_alter_table().
161
162
     @param type  field type
163
164
     @retval
165
       true  Type can have a prefixed key
166
     @retval
167
       false Type can not have a prefixed key
168
  */
1 by brian
clean slate
169
  static bool type_can_have_key_part(enum_field_types);
170
  static enum_field_types field_type_merge(enum_field_types, enum_field_types);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
171
172
  /**
173
     Detect Item_result by given field type of UNION merge result.
174
175
     @param field_type  given field type
176
177
     @return
178
       Item_result (type of internal MySQL expression result)
179
  */
1 by brian
clean slate
180
  static Item_result result_merge_type(enum_field_types);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
181
182
  virtual bool eq(Field *field);
1 by brian
clean slate
183
  virtual bool eq_def(Field *field);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
184
1 by brian
clean slate
185
  /*
186
    pack_length() returns size (in bytes) used to store field data in memory
187
    (i.e. it returns the maximum size of the field in a row of the table,
188
    which is located in RAM).
189
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
190
  virtual uint32_t pack_length() const;
1 by brian
clean slate
191
192
  /*
193
    pack_length_in_rec() returns size (in bytes) used to store field data on
194
    storage (i.e. it returns the maximal size of the field in a row of the
195
    table, which is located on disk).
196
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
197
  virtual uint32_t pack_length_in_rec() const;
438.1.13 by Brian Aker
uint cleanup.
198
  virtual int compatible_field_size(uint32_t field_metadata);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
199
  virtual uint32_t pack_length_from_metadata(uint32_t field_metadata);
200
1 by brian
clean slate
201
  /*
202
    This method is used to return the size of the data in a row-based
203
    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
204
    designed to allow fields that do not use metadata to return true (1)
1 by brian
clean slate
205
    from compatible_field_size() which uses this function in the comparison.
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
206
    The default value for field metadata for fields that do not have
1 by brian
clean slate
207
    metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
208
209
    Note: While most classes that override this method return pack_length(),
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
210
    the classes Field_varstring, and Field_blob return
1 by brian
clean slate
211
    field_length + 1, field_length, and pack_length_no_ptr() respectfully.
212
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
213
  virtual uint32_t row_pack_length();
214
  virtual int save_field_metadata(unsigned char *first_byte);
1 by brian
clean slate
215
216
  /*
217
    data_length() return the "real size" of the data in memory.
218
    For varstrings, this does _not_ include the length bytes.
219
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
220
  virtual uint32_t data_length();
1 by brian
clean slate
221
  /*
222
    used_length() returns the number of bytes actually used to store the data
223
    of the field. So for a varstring it includes both lenght byte(s) and
224
    string data, and anything after data_length() bytes are unused.
225
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
226
  virtual uint32_t used_length();
227
  virtual uint32_t sort_length() const;
1 by brian
clean slate
228
229
  /**
230
     Get the maximum size of the data in packed format.
231
232
     @return Maximum data length of the field when packed using the
233
     Field::pack() function.
234
   */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
235
  virtual uint32_t max_data_length() const;
236
  virtual int reset(void);
237
  virtual void reset_fields();
238
  virtual void set_default();
239
  virtual bool binary() const;
240
  virtual bool zero_pack() const;
241
  virtual enum ha_base_keytype key_type() const;
242
  virtual uint32_t key_length() const;
1 by brian
clean slate
243
  virtual enum_field_types type() const =0;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
244
  virtual enum_field_types real_type() const;
481 by Brian Aker
Remove all of uchar.
245
  inline  int cmp(const unsigned char *str) { return cmp(ptr,str); }
246
  virtual int cmp_max(const unsigned char *a, const unsigned char *b,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
247
                      uint32_t max_len);
481 by Brian Aker
Remove all of uchar.
248
  virtual int cmp(const unsigned char *,const unsigned char *)=0;
249
  virtual int cmp_binary(const unsigned char *a,const unsigned char *b,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
250
                         uint32_t max_length=UINT32_MAX);
251
  virtual int cmp_offset(uint32_t row_offset);
252
  virtual int cmp_binary_offset(uint32_t row_offset);
253
  virtual int key_cmp(const unsigned char *a,const unsigned char *b);
254
  virtual int key_cmp(const unsigned char *str, uint32_t length);
255
  virtual uint32_t decimals() const;
256
1 by brian
clean slate
257
  /*
258
    Caller beware: sql_type can change str.Ptr, so check
259
    ptr() to see if it changed if you are using your own buffer
260
    in str and restore it with set() if needed
261
  */
262
  virtual void sql_type(String &str) const =0;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
263
264
  // For new field
265
  virtual uint32_t size_of() const =0;
266
267
  bool is_null(my_ptrdiff_t row_offset= 0);
268
  bool is_real_null(my_ptrdiff_t row_offset= 0);
269
  bool is_null_in_record(const unsigned char *record);
270
  bool is_null_in_record_with_offset(my_ptrdiff_t offset);
271
  void set_null(my_ptrdiff_t row_offset= 0);
272
  void set_notnull(my_ptrdiff_t row_offset= 0);
273
  bool maybe_null(void);
274
  bool real_maybe_null(void);
1 by brian
clean slate
275
276
  enum {
277
    LAST_NULL_BYTE_UNDEF= 0
278
  };
279
280
  /*
281
    Find the position of the last null byte for the field.
282
283
    SYNOPSIS
284
      last_null_byte()
285
286
    DESCRIPTION
287
      Return a pointer to the last byte of the null bytes where the
288
      field conceptually is placed.
289
290
    RETURN VALUE
291
      The position of the last null byte relative to the beginning of
292
      the record. If the field does not use any bits of the null
293
      bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned.
294
   */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
295
  size_t last_null_byte() const;
1 by brian
clean slate
296
297
  virtual void make_field(Send_field *);
481 by Brian Aker
Remove all of uchar.
298
  virtual void sort_string(unsigned char *buff,uint32_t length)=0;
438.1.13 by Brian Aker
uint cleanup.
299
  virtual bool optimize_range(uint32_t idx, uint32_t part);
1 by brian
clean slate
300
  /*
301
    This should be true for fields which, when compared with constant
152 by Brian Aker
longlong replacement
302
    items, can be casted to int64_t. In this case we will at 'fix_fields'
303
    stage cast the constant items to int64_ts and at the execution stage
1 by brian
clean slate
304
    use field->val_int() for comparison.  Used to optimize clauses like
305
    'a_column BETWEEN date_const, date_const'.
306
  */
152 by Brian Aker
longlong replacement
307
  virtual bool can_be_compared_as_int64_t() const { return false; }
1 by brian
clean slate
308
  virtual void free() {}
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
309
  virtual Field *new_field(MEM_ROOT *root, Table *new_table,
1 by brian
clean slate
310
                           bool keep_type);
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
311
  virtual Field *new_key_field(MEM_ROOT *root, Table *new_table,
481 by Brian Aker
Remove all of uchar.
312
                               unsigned char *new_ptr, unsigned char *new_null_ptr,
438.1.13 by Brian Aker
uint cleanup.
313
                               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).
314
  Field *clone(MEM_ROOT *mem_root, Table *new_table);
481 by Brian Aker
Remove all of uchar.
315
  inline void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
1 by brian
clean slate
316
  {
317
    ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
318
  }
481 by Brian Aker
Remove all of uchar.
319
  inline void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
1 by brian
clean slate
320
  virtual void move_field_offset(my_ptrdiff_t ptr_diff)
321
  {
481 by Brian Aker
Remove all of uchar.
322
    ptr=ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
1 by brian
clean slate
323
    if (null_ptr)
481 by Brian Aker
Remove all of uchar.
324
      null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
1 by brian
clean slate
325
  }
481 by Brian Aker
Remove all of uchar.
326
  virtual void get_image(unsigned char *buff, uint32_t length,
644 by Brian Aker
Clean up warnings for Solaris.
327
                         const CHARSET_INFO * const)
1 by brian
clean slate
328
    { memcpy(buff,ptr,length); }
656.1.1 by Monty Taylor
OOOh doggie. Got rid of my_alloca.
329
  virtual void get_image(std::basic_string<unsigned char> &buff,
330
                         uint32_t length,
331
                         const CHARSET_INFO * const)
332
    { buff.append(ptr,length); }
481 by Brian Aker
Remove all of uchar.
333
  virtual void set_image(const unsigned char *buff,uint32_t length,
644 by Brian Aker
Clean up warnings for Solaris.
334
                         const CHARSET_INFO * const)
1 by brian
clean slate
335
    { memcpy(ptr,buff,length); }
336
337
338
  /*
339
    Copy a field part into an output buffer.
340
341
    SYNOPSIS
342
      Field::get_key_image()
343
      buff   [out] output buffer
344
      length       output buffer size
345
      type         itMBR for geometry blobs, otherwise itRAW
346
347
    DESCRIPTION
348
      This function makes a copy of field part of size equal to or
349
      less than "length" parameter value.
350
      For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
351
      is padded by zero byte.
352
353
    NOTES
354
      For variable length character fields (i.e. UTF-8) the "length"
355
      parameter means a number of output buffer bytes as if all field
356
      characters have maximal possible size (mbmaxlen). In the other words,
357
      "length" parameter is a number of characters multiplied by
358
      field_charset->mbmaxlen.
359
360
    RETURN
361
      Number of copied bytes (excluding padded zero bytes -- see above).
362
  */
363
644 by Brian Aker
Clean up warnings for Solaris.
364
  virtual uint32_t get_key_image(unsigned char *buff, uint32_t length, imagetype)
1 by brian
clean slate
365
  {
366
    get_image(buff, length, &my_charset_bin);
367
    return length;
368
  }
656.1.1 by Monty Taylor
OOOh doggie. Got rid of my_alloca.
369
  virtual uint32_t get_key_image(std::basic_string<unsigned char> &buff,
370
                                 uint32_t length, imagetype)
371
  {
372
    get_image(buff, length, &my_charset_bin);
373
    return length;
374
  }
481 by Brian Aker
Remove all of uchar.
375
  virtual void set_key_image(const unsigned char *buff,uint32_t length)
779.3.18 by Monty Taylor
Cleaned up warnings up through innodb.
376
  { set_image(buff,length, &my_charset_bin); }
438.1.13 by Brian Aker
uint cleanup.
377
  inline int64_t val_int_offset(uint32_t row_offset)
779.3.18 by Monty Taylor
Cleaned up warnings up through innodb.
378
  {
379
    ptr+=row_offset;
380
    int64_t tmp=val_int();
381
    ptr-=row_offset;
382
    return tmp;
383
  }
384
385
  inline int64_t val_int(const unsigned char *new_ptr)
386
  {
387
    unsigned char *old_ptr= ptr;
388
    int64_t return_value;
389
    ptr= (unsigned char*) new_ptr;
390
    return_value= val_int();
391
    ptr= old_ptr;
392
    return return_value;
393
  }
394
  inline String *val_str(String *str, const unsigned char *new_ptr)
395
  {
396
    unsigned char *old_ptr= ptr;
397
    ptr= (unsigned char*) new_ptr;
398
    val_str(str);
399
    ptr= old_ptr;
400
    return str;
401
  }
402
779.3.16 by Monty Taylor
Some Sun warning fixes.
403
  virtual unsigned char *pack(unsigned char *to,
404
                              const unsigned char *from,
405
                              uint32_t max_length,
406
                              bool low_byte_first);
407
779.3.18 by Monty Taylor
Cleaned up warnings up through innodb.
408
  unsigned char *pack(unsigned char *to, const unsigned char *from);
1 by brian
clean slate
409
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
410
  virtual const unsigned char *unpack(unsigned char* to,
411
                                      const unsigned char *from,
412
                                      uint32_t param_data,
413
                                      bool low_byte_first);
1 by brian
clean slate
414
  /**
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
415
     @overload Field::unpack(unsigned char*, const unsigned char*,
416
                             uint32_t, bool)
1 by brian
clean slate
417
  */
779.3.18 by Monty Taylor
Cleaned up warnings up through innodb.
418
  const unsigned char *unpack(unsigned char* to,
419
                              const unsigned char *from);
1 by brian
clean slate
420
481 by Brian Aker
Remove all of uchar.
421
  virtual unsigned char *pack_key(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
422
                          uint32_t max_length, bool low_byte_first)
1 by brian
clean slate
423
  {
424
    return pack(to, from, max_length, low_byte_first);
425
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
426
  virtual unsigned char *pack_key_from_key_image(unsigned char* to,
427
                                                 const unsigned char *from,
428
                                                 uint32_t max_length,
429
                                                 bool low_byte_first)
1 by brian
clean slate
430
  {
431
    return pack(to, from, max_length, low_byte_first);
432
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
433
  virtual const unsigned char *unpack_key(unsigned char* to,
434
                                          const unsigned char *from,
435
                                          uint32_t max_length,
436
                                          bool low_byte_first)
1 by brian
clean slate
437
  {
438
    return unpack(to, from, max_length, low_byte_first);
439
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
440
  virtual uint32_t packed_col_length(const unsigned char *to, uint32_t length);
438.1.13 by Brian Aker
uint cleanup.
441
  virtual uint32_t max_packed_col_length(uint32_t max_length)
1 by brian
clean slate
442
  { return max_length;}
443
481 by Brian Aker
Remove all of uchar.
444
  virtual int pack_cmp(const unsigned char *a,const unsigned char *b,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
445
                       uint32_t key_length_arg,
446
                       bool insert_or_update);
481 by Brian Aker
Remove all of uchar.
447
  virtual int pack_cmp(const unsigned char *b,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
448
                       uint32_t key_length_arg,
449
                       bool insert_or_update);
450
481 by Brian Aker
Remove all of uchar.
451
  uint32_t offset(unsigned char *record)
1 by brian
clean slate
452
  {
438.1.13 by Brian Aker
uint cleanup.
453
    return (uint32_t) (ptr - record);
1 by brian
clean slate
454
  }
455
  void copy_from_tmp(int offset);
438.1.13 by Brian Aker
uint cleanup.
456
  uint32_t fill_cache_field(struct st_cache_field *copy);
457
  virtual bool get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate);
236.1.24 by Monty Taylor
Renamed MYSQL_TIME to DRIZZLE_TIME.
458
  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.
459
  virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
460
  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
461
  virtual bool has_charset(void) const { return false; }
644 by Brian Aker
Clean up warnings for Solaris.
462
  virtual void set_charset(const CHARSET_INFO * const)
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
463
  { }
1 by brian
clean slate
464
  virtual enum Derivation derivation(void) const
465
  { return DERIVATION_IMPLICIT; }
644 by Brian Aker
Clean up warnings for Solaris.
466
  virtual void set_derivation(enum Derivation)
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
467
  { }
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
468
  bool set_warning(DRIZZLE_ERROR::enum_warning_level, unsigned int code,
1 by brian
clean slate
469
                   int cuted_increment);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
470
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code,
438.1.13 by Brian Aker
uint cleanup.
471
                            const char *str, uint32_t str_len,
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
472
                            enum enum_drizzle_timestamp_type ts_type, int cuted_increment);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
473
  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;
474
                            int64_t nr, enum enum_drizzle_timestamp_type ts_type,
1 by brian
clean slate
475
                            int cuted_increment);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
476
  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;
477
                            double nr, enum enum_drizzle_timestamp_type ts_type);
1 by brian
clean slate
478
  inline bool check_overflow(int op_result)
479
  {
480
    return (op_result == E_DEC_OVERFLOW);
481
  }
482
  int warn_if_overflow(int op_result);
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
483
  void init(Table *table_arg);
1 by brian
clean slate
484
485
  /* maximum possible display length */
205 by Brian Aker
uint32 -> uin32_t
486
  virtual uint32_t max_display_length()= 0;
1 by brian
clean slate
487
438.1.13 by Brian Aker
uint cleanup.
488
  virtual uint32_t is_equal(Create_field *new_field);
152 by Brian Aker
longlong replacement
489
  /* convert decimal to int64_t with overflow check */
490
  int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
1 by brian
clean slate
491
                                    int *err);
492
  /* The max. number of characters */
205 by Brian Aker
uint32 -> uin32_t
493
  inline uint32_t char_length() const
1 by brian
clean slate
494
  {
495
    return field_length / charset()->mbmaxlen;
496
  }
497
498
  inline enum column_format_type column_format() const
499
  {
500
    return (enum column_format_type)
501
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
502
  }
503
504
  /* Hash value */
290 by Brian Aker
Update for ulong change over.
505
  virtual void hash(uint32_t *nr, uint32_t *nr2);
520.1.21 by Brian Aker
THD -> Session rename
506
  friend bool reopen_table(Session *,Table *,bool);
438.1.13 by Brian Aker
uint cleanup.
507
  friend int cre_myisam(char * name, register Table *form, uint32_t options,
1 by brian
clean slate
508
			uint64_t auto_increment_value);
509
  friend class Copy_field;
510
  friend class Item_avg_field;
511
  friend class Item_std_field;
512
  friend class Item_sum_num;
513
  friend class Item_sum_sum;
514
  friend class Item_sum_str;
515
  friend class Item_sum_count;
516
  friend class Item_sum_avg;
517
  friend class Item_sum_std;
518
  friend class Item_sum_min;
519
  friend class Item_sum_max;
520
  friend class Item_func_group_concat;
521
1003.1.6 by Brian Aker
Added interface for field to get read/write on its own.
522
  bool isRead();
523
  bool isWrite();
524
1 by brian
clean slate
525
private:
526
  /*
527
    Primitive for implementing last_null_byte().
528
529
    SYNOPSIS
530
      do_last_null_byte()
531
532
    DESCRIPTION
533
      Primitive for the implementation of the last_null_byte()
534
      function. This represents the inheritance interface and can be
535
      overridden by subclasses.
536
   */
537
  virtual size_t do_last_null_byte() const;
538
539
/**
540
   Retrieve the field metadata for fields.
541
542
   This default implementation returns 0 and saves 0 in the metadata_ptr
543
   value.
544
545
   @param   metadata_ptr   First byte of field metadata
546
547
   @returns 0 no bytes written.
548
*/
644 by Brian Aker
Clean up warnings for Solaris.
549
  virtual int do_save_field_metadata(unsigned char *)
1 by brian
clean slate
550
  { return 0; }
551
};
552
553
/*
554
  Create field class for CREATE TABLE
555
*/
556
557
class Create_field :public Sql_alloc
558
{
559
public:
560
  const char *field_name;
561
  const char *change;			// If done with alter table
562
  const char *after;			// Put column after this one
563
  LEX_STRING comment;			// Comment for field
564
  Item	*def;				// Default value
565
  enum	enum_field_types sql_type;
566
  /*
567
    At various stages in execution this can be length of field in bytes or
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
568
    max number of characters.
1 by brian
clean slate
569
  */
290 by Brian Aker
Update for ulong change over.
570
  uint32_t length;
1 by brian
clean slate
571
  /*
572
    The value of `length' as set by parser: is the number of characters
573
    for most of the types, or of bytes for BLOBs or numeric types.
574
  */
205 by Brian Aker
uint32 -> uin32_t
575
  uint32_t char_length;
438.1.13 by Brian Aker
uint cleanup.
576
  uint32_t  decimals, flags, pack_length, key_length;
1 by brian
clean slate
577
  Field::utype unireg_check;
578
  TYPELIB *interval;			// Which interval to use
579
  List<String> interval_list;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
580
  const CHARSET_INFO *charset;
1 by brian
clean slate
581
  Field *field;				// For alter table
582
869.1.7 by Stewart Smith
remove row, col and sc_length from FRM file and Create_field.
583
  uint8_t       interval_id;	// For rea_create_table
438.1.13 by Brian Aker
uint cleanup.
584
  uint32_t	offset,pack_flag;
383.7.1 by Andrey Zhakov
Initial submit of code and tests
585
1 by brian
clean slate
586
  Create_field() :after(0) {}
587
  Create_field(Field *field, Field *orig_field);
588
  /* Used to make a clone of this object for ALTER/CREATE TABLE */
589
  Create_field *clone(MEM_ROOT *mem_root) const
590
    { return new (mem_root) Create_field(*this); }
591
  void create_length_to_internal_length(void);
592
593
  inline enum column_format_type column_format() const
594
  {
595
    return (enum column_format_type)
596
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
597
  }
598
599
  /* Init for a tmp table field. To be extended if need be. */
600
  void init_for_tmp_table(enum_field_types sql_type_arg,
205 by Brian Aker
uint32 -> uin32_t
601
                          uint32_t max_length, uint32_t decimals,
1 by brian
clean slate
602
                          bool maybe_null, bool is_unsigned);
603
520.1.22 by Brian Aker
Second pass of thd cleanup
604
  bool init(Session *session, char *field_name, enum_field_types type, char *length,
438.1.13 by Brian Aker
uint cleanup.
605
            char *decimals, uint32_t type_modifier, Item *default_value,
1 by brian
clean slate
606
            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.
607
            List<String> *interval_list, const CHARSET_INFO * const cs,
438.1.13 by Brian Aker
uint cleanup.
608
            uint32_t uint_geom_type,
998.1.2 by Brian Aker
First pass on removing virt columns
609
            enum column_format_type column_format);
1 by brian
clean slate
610
};
611
612
613
/*
614
  A class for sending info to the client
615
*/
616
617
class Send_field {
618
 public:
619
  const char *db_name;
620
  const char *table_name,*org_table_name;
621
  const char *col_name,*org_col_name;
290 by Brian Aker
Update for ulong change over.
622
  uint32_t length;
438.1.13 by Brian Aker
uint cleanup.
623
  uint32_t charsetnr, flags, decimals;
1 by brian
clean slate
624
  enum_field_types type;
625
  Send_field() {}
626
};
627
628
629
/*
630
  A class for quick copying data to fields
631
*/
632
633
class Copy_field :public Sql_alloc {
634
  /**
635
    Convenience definition of a copy function returned by
636
    get_copy_func.
637
  */
638
  typedef void Copy_func(Copy_field*);
639
  Copy_func *get_copy_func(Field *to, Field *from);
640
public:
481 by Brian Aker
Remove all of uchar.
641
  unsigned char *from_ptr,*to_ptr;
642
  unsigned char *from_null_ptr,*to_null_ptr;
274 by Brian Aker
my_bool conversion in Table
643
  bool *null_row;
438.1.13 by Brian Aker
uint cleanup.
644
  uint32_t	from_bit,to_bit;
645
  uint32_t from_length,to_length;
1 by brian
clean slate
646
  Field *from_field,*to_field;
647
  String tmp;					// For items
648
649
  Copy_field() {}
650
  ~Copy_field() {}
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
651
  void set(Field *to,Field *from,bool save);	// Field to field
481 by Brian Aker
Remove all of uchar.
652
  void set(unsigned char *to,Field *from);		// Field to string
1 by brian
clean slate
653
  void (*do_copy)(Copy_field *);
654
  void (*do_copy2)(Copy_field *);		// Used to handle null values
655
};
656
657
1000.1.3 by Brian Aker
Renamed TABLE_SHARE to TableShare
658
Field *make_field(TableShare *share, MEM_ROOT *root, unsigned char *ptr, uint32_t field_length,
575.4.7 by Monty Taylor
More header cleanup.
659
                  unsigned char *null_pos, unsigned char null_bit,
660
                  uint32_t pack_flag, enum_field_types field_type,
661
                  const CHARSET_INFO * cs,
662
                  Field::utype unireg_check,
663
                  TYPELIB *interval, const char *field_name);
664
438.1.13 by Brian Aker
uint cleanup.
665
uint32_t pack_length_to_packflag(uint32_t type);
290 by Brian Aker
Update for ulong change over.
666
enum_field_types get_blob_type_from_length(uint32_t length);
205 by Brian Aker
uint32 -> uin32_t
667
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
1 by brian
clean slate
668
int set_field_to_null(Field *field);
669
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
670
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
671
483.1.4 by Lee
break out Field_longstr
672
bool
584.5.1 by Monty Taylor
Removed field includes from field.h.
673
test_if_important_data(const CHARSET_INFO * const cs,
674
                       const char *str,
483.1.4 by Lee
break out Field_longstr
675
                       const char *strend);
676
520.8.2 by Monty Taylor
Moved sql_parse.h and sql_error.h out of common_includes.
677
678
#endif /* DRIZZLED_FIELD_H */