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