~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>
32
#include <drizzled/lex_string.h>
1 by brian
clean slate
33
34
#define DATETIME_DEC                     6
173.1.9 by Toru Maesaka
ripped out DOUBLE and moved to field/
35
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
36
205 by Brian Aker
uint32 -> uin32_t
37
const uint32_t max_field_size= (uint32_t) 4294967295U;
1 by brian
clean slate
38
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
39
class Table;
1 by brian
clean slate
40
class Send_field;
41
class Protocol;
42
class Create_field;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
43
class virtual_column_info;
44
45
typedef struct st_table_share TABLE_SHARE;
46
1 by brian
clean slate
47
struct st_cache_field;
48
int field_conv(Field *to,Field *from);
49
438.1.13 by Brian Aker
uint cleanup.
50
inline uint32_t get_enum_pack_length(int elements)
1 by brian
clean slate
51
{
52
  return elements < 256 ? 1 : 2;
53
}
54
438.1.13 by Brian Aker
uint cleanup.
55
inline uint32_t get_set_pack_length(int elements)
1 by brian
clean slate
56
{
438.1.13 by Brian Aker
uint cleanup.
57
  uint32_t len= (elements + 7) / 8;
1 by brian
clean slate
58
  return len > 4 ? 8 : len;
59
}
60
61
class Field
62
{
63
  Field(const Item &);				/* Prevent use of these */
64
  void operator=(Field &);
65
public:
66
  static void *operator new(size_t size) {return sql_alloc(size); }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
67
  static void operator delete(void *ptr_arg __attribute__((unused)),
68
                              size_t size __attribute__((unused)))
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
  /*
520.1.22 by Brian Aker
Second pass of thd cleanup
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
  */
92
  enum utype  { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
93
                CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
1 by brian
clean slate
94
                BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD,
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 */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
128
  virtual int  store(const char *to, uint32_t length,
129
                     const CHARSET_INFO * const cs)=0;
1 by brian
clean slate
130
  virtual int  store(double nr)=0;
152 by Brian Aker
longlong replacement
131
  virtual int  store(int64_t nr, bool unsigned_val)=0;
1 by brian
clean slate
132
  virtual int  store_decimal(const my_decimal *d)=0;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
133
  virtual int store_time(DRIZZLE_TIME *ltime,
134
                         enum enum_drizzle_timestamp_type t_type);
438.1.13 by Brian Aker
uint cleanup.
135
  int store(const char *to, uint32_t length, const CHARSET_INFO * const cs,
1 by brian
clean slate
136
            enum_check_fields check_level);
137
  virtual double val_real(void)=0;
152 by Brian Aker
longlong replacement
138
  virtual int64_t val_int(void)=0;
1 by brian
clean slate
139
  virtual my_decimal *val_decimal(my_decimal *);
140
  inline String *val_str(String *str) { return val_str(str, str); }
141
  /*
142
     val_str(buf1, buf2) gets two buffers and should use them as follows:
143
     if it needs a temp buffer to convert result to string - use buf1
144
       example Field_tiny::val_str()
145
     if the value exists as a string already - use buf2
241 by Brian Aker
First pass of CHAR removal.
146
       example Field_varstring::val_str() (???)
1 by brian
clean slate
147
     consequently, buf2 may be created as 'String buf;' - no memory
148
     will be allocated for it. buf1 will be allocated to hold a
149
     value if it's too small. Using allocated buffer for buf2 may result in
150
     an unnecessary free (and later, may be an alloc).
151
     This trickery is used to decrease a number of malloc calls.
152
  */
153
  virtual String *val_str(String*,String *)=0;
275 by Brian Aker
Full removal of my_bool from central server.
154
  String *val_int_as_str(String *val_buffer, bool unsigned_flag);
1 by brian
clean slate
155
  /*
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
156
   str_needs_quotes() returns true if the value returned by val_str() needs
1 by brian
clean slate
157
   to be quoted when used in constructing an SQL query.
158
  */
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
159
  virtual bool str_needs_quotes() { return false; }
1 by brian
clean slate
160
  virtual Item_result result_type () const=0;
161
  virtual Item_result cmp_type () const { return result_type(); }
162
  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.
163
  /**
164
     Check whether a field type can be partially indexed by a key.
165
166
     This is a static method, rather than a virtual function, because we need
167
     to check the type of a non-Field in mysql_alter_table().
168
169
     @param type  field type
170
171
     @retval
172
       true  Type can have a prefixed key
173
     @retval
174
       false Type can not have a prefixed key
175
  */
1 by brian
clean slate
176
  static bool type_can_have_key_part(enum_field_types);
177
  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.
178
179
  /**
180
     Detect Item_result by given field type of UNION merge result.
181
182
     @param field_type  given field type
183
184
     @return
185
       Item_result (type of internal MySQL expression result)
186
  */
1 by brian
clean slate
187
  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.
188
189
  virtual bool eq(Field *field);
1 by brian
clean slate
190
  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.
191
1 by brian
clean slate
192
  /*
193
    pack_length() returns size (in bytes) used to store field data in memory
194
    (i.e. it returns the maximum size of the field in a row of the table,
195
    which is located in RAM).
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() const;
1 by brian
clean slate
198
199
  /*
200
    pack_length_in_rec() returns size (in bytes) used to store field data on
201
    storage (i.e. it returns the maximal size of the field in a row of the
202
    table, which is located on disk).
203
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
204
  virtual uint32_t pack_length_in_rec() const;
438.1.13 by Brian Aker
uint cleanup.
205
  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.
206
  virtual uint32_t pack_length_from_metadata(uint32_t field_metadata);
207
1 by brian
clean slate
208
  /*
209
    This method is used to return the size of the data in a row-based
210
    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
211
    designed to allow fields that do not use metadata to return true (1)
1 by brian
clean slate
212
    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.
213
    The default value for field metadata for fields that do not have
1 by brian
clean slate
214
    metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
215
216
    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.
217
    the classes Field_varstring, and Field_blob return
1 by brian
clean slate
218
    field_length + 1, field_length, and pack_length_no_ptr() respectfully.
219
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
220
  virtual uint32_t row_pack_length();
221
  virtual int save_field_metadata(unsigned char *first_byte);
1 by brian
clean slate
222
223
  /*
224
    data_length() return the "real size" of the data in memory.
225
    For varstrings, this does _not_ include the length bytes.
226
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
227
  virtual uint32_t data_length();
1 by brian
clean slate
228
  /*
229
    used_length() returns the number of bytes actually used to store the data
230
    of the field. So for a varstring it includes both lenght byte(s) and
231
    string data, and anything after data_length() bytes are unused.
232
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
233
  virtual uint32_t used_length();
234
  virtual uint32_t sort_length() const;
1 by brian
clean slate
235
236
  /**
237
     Get the maximum size of the data in packed format.
238
239
     @return Maximum data length of the field when packed using the
240
     Field::pack() function.
241
   */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
242
  virtual uint32_t max_data_length() const;
243
  virtual int reset(void);
244
  virtual void reset_fields();
245
  virtual void set_default();
246
  virtual bool binary() const;
247
  virtual bool zero_pack() const;
248
  virtual enum ha_base_keytype key_type() const;
249
  virtual uint32_t key_length() const;
1 by brian
clean slate
250
  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.
251
  virtual enum_field_types real_type() const;
481 by Brian Aker
Remove all of uchar.
252
  inline  int cmp(const unsigned char *str) { return cmp(ptr,str); }
253
  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.
254
                      uint32_t max_len);
481 by Brian Aker
Remove all of uchar.
255
  virtual int cmp(const unsigned char *,const unsigned char *)=0;
256
  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.
257
                         uint32_t max_length=UINT32_MAX);
258
  virtual int cmp_offset(uint32_t row_offset);
259
  virtual int cmp_binary_offset(uint32_t row_offset);
260
  virtual int key_cmp(const unsigned char *a,const unsigned char *b);
261
  virtual int key_cmp(const unsigned char *str, uint32_t length);
262
  virtual uint32_t decimals() const;
263
1 by brian
clean slate
264
  /*
265
    Caller beware: sql_type can change str.Ptr, so check
266
    ptr() to see if it changed if you are using your own buffer
267
    in str and restore it with set() if needed
268
  */
269
  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.
270
271
  // For new field
272
  virtual uint32_t size_of() const =0;
273
274
  bool is_null(my_ptrdiff_t row_offset= 0);
275
  bool is_real_null(my_ptrdiff_t row_offset= 0);
276
  bool is_null_in_record(const unsigned char *record);
277
  bool is_null_in_record_with_offset(my_ptrdiff_t offset);
278
  void set_null(my_ptrdiff_t row_offset= 0);
279
  void set_notnull(my_ptrdiff_t row_offset= 0);
280
  bool maybe_null(void);
281
  bool real_maybe_null(void);
1 by brian
clean slate
282
283
  enum {
284
    LAST_NULL_BYTE_UNDEF= 0
285
  };
286
287
  /*
288
    Find the position of the last null byte for the field.
289
290
    SYNOPSIS
291
      last_null_byte()
292
293
    DESCRIPTION
294
      Return a pointer to the last byte of the null bytes where the
295
      field conceptually is placed.
296
297
    RETURN VALUE
298
      The position of the last null byte relative to the beginning of
299
      the record. If the field does not use any bits of the null
300
      bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned.
301
   */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
302
  size_t last_null_byte() const;
1 by brian
clean slate
303
304
  virtual void make_field(Send_field *);
481 by Brian Aker
Remove all of uchar.
305
  virtual void sort_string(unsigned char *buff,uint32_t length)=0;
438.1.13 by Brian Aker
uint cleanup.
306
  virtual bool optimize_range(uint32_t idx, uint32_t part);
1 by brian
clean slate
307
  /*
308
    This should be true for fields which, when compared with constant
152 by Brian Aker
longlong replacement
309
    items, can be casted to int64_t. In this case we will at 'fix_fields'
310
    stage cast the constant items to int64_ts and at the execution stage
1 by brian
clean slate
311
    use field->val_int() for comparison.  Used to optimize clauses like
312
    'a_column BETWEEN date_const, date_const'.
313
  */
152 by Brian Aker
longlong replacement
314
  virtual bool can_be_compared_as_int64_t() const { return false; }
1 by brian
clean slate
315
  virtual void free() {}
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
316
  virtual Field *new_field(MEM_ROOT *root, Table *new_table,
1 by brian
clean slate
317
                           bool keep_type);
327.1.1 by Brian Aker
First pass in encapsulating table (it is now an object, no longer a structure).
318
  virtual Field *new_key_field(MEM_ROOT *root, Table *new_table,
481 by Brian Aker
Remove all of uchar.
319
                               unsigned char *new_ptr, unsigned char *new_null_ptr,
438.1.13 by Brian Aker
uint cleanup.
320
                               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).
321
  Field *clone(MEM_ROOT *mem_root, Table *new_table);
481 by Brian Aker
Remove all of uchar.
322
  inline void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
1 by brian
clean slate
323
  {
324
    ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
325
  }
481 by Brian Aker
Remove all of uchar.
326
  inline void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
1 by brian
clean slate
327
  virtual void move_field_offset(my_ptrdiff_t ptr_diff)
328
  {
481 by Brian Aker
Remove all of uchar.
329
    ptr=ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
1 by brian
clean slate
330
    if (null_ptr)
481 by Brian Aker
Remove all of uchar.
331
      null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
1 by brian
clean slate
332
  }
481 by Brian Aker
Remove all of uchar.
333
  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.
334
                         const CHARSET_INFO * const cs __attribute__((unused)))
1 by brian
clean slate
335
    { memcpy(buff,ptr,length); }
481 by Brian Aker
Remove all of uchar.
336
  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.
337
                         const CHARSET_INFO * const cs __attribute__((unused)))
1 by brian
clean slate
338
    { memcpy(ptr,buff,length); }
339
340
341
  /*
342
    Copy a field part into an output buffer.
343
344
    SYNOPSIS
345
      Field::get_key_image()
346
      buff   [out] output buffer
347
      length       output buffer size
348
      type         itMBR for geometry blobs, otherwise itRAW
349
350
    DESCRIPTION
351
      This function makes a copy of field part of size equal to or
352
      less than "length" parameter value.
353
      For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
354
      is padded by zero byte.
355
356
    NOTES
357
      For variable length character fields (i.e. UTF-8) the "length"
358
      parameter means a number of output buffer bytes as if all field
359
      characters have maximal possible size (mbmaxlen). In the other words,
360
      "length" parameter is a number of characters multiplied by
361
      field_charset->mbmaxlen.
362
363
    RETURN
364
      Number of copied bytes (excluding padded zero bytes -- see above).
365
  */
366
481 by Brian Aker
Remove all of uchar.
367
  virtual uint32_t get_key_image(unsigned char *buff, uint32_t length,
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
368
                             imagetype type __attribute__((unused)))
1 by brian
clean slate
369
  {
370
    get_image(buff, length, &my_charset_bin);
371
    return length;
372
  }
481 by Brian Aker
Remove all of uchar.
373
  virtual void set_key_image(const unsigned char *buff,uint32_t length)
1 by brian
clean slate
374
    { set_image(buff,length, &my_charset_bin); }
438.1.13 by Brian Aker
uint cleanup.
375
  inline int64_t val_int_offset(uint32_t row_offset)
1 by brian
clean slate
376
    {
377
      ptr+=row_offset;
152 by Brian Aker
longlong replacement
378
      int64_t tmp=val_int();
1 by brian
clean slate
379
      ptr-=row_offset;
380
      return tmp;
381
    }
481 by Brian Aker
Remove all of uchar.
382
  inline int64_t val_int(const unsigned char *new_ptr)
1 by brian
clean slate
383
  {
481 by Brian Aker
Remove all of uchar.
384
    unsigned char *old_ptr= ptr;
152 by Brian Aker
longlong replacement
385
    int64_t return_value;
481 by Brian Aker
Remove all of uchar.
386
    ptr= (unsigned char*) new_ptr;
1 by brian
clean slate
387
    return_value= val_int();
388
    ptr= old_ptr;
389
    return return_value;
390
  }
481 by Brian Aker
Remove all of uchar.
391
  inline String *val_str(String *str, const unsigned char *new_ptr)
1 by brian
clean slate
392
  {
481 by Brian Aker
Remove all of uchar.
393
    unsigned char *old_ptr= ptr;
394
    ptr= (unsigned char*) new_ptr;
1 by brian
clean slate
395
    val_str(str);
396
    ptr= old_ptr;
397
    return str;
398
  }
399
  virtual bool send_binary(Protocol *protocol);
400
481 by Brian Aker
Remove all of uchar.
401
  virtual unsigned char *pack(unsigned char *to, const unsigned char *from,
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
402
                              uint32_t max_length, bool low_byte_first);
1 by brian
clean slate
403
  /**
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
404
     @overload Field::pack(unsigned char*, const unsigned char*,
405
                           uint32_t, bool)
1 by brian
clean slate
406
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
407
  unsigned char *pack(unsigned char *to, const unsigned char *from);
1 by brian
clean slate
408
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
409
  virtual const unsigned char *unpack(unsigned char* to,
410
                                      const unsigned char *from,
411
                                      uint32_t param_data,
412
                                      bool low_byte_first);
1 by brian
clean slate
413
  /**
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
414
     @overload Field::unpack(unsigned char*, const unsigned char*,
415
                             uint32_t, bool)
1 by brian
clean slate
416
  */
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
417
  const unsigned char *unpack(unsigned char* to, const unsigned char *from);
1 by brian
clean slate
418
481 by Brian Aker
Remove all of uchar.
419
  virtual unsigned char *pack_key(unsigned char* to, const unsigned char *from,
438.1.13 by Brian Aker
uint cleanup.
420
                          uint32_t max_length, bool low_byte_first)
1 by brian
clean slate
421
  {
422
    return pack(to, from, max_length, low_byte_first);
423
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
424
  virtual unsigned char *pack_key_from_key_image(unsigned char* to,
425
                                                 const unsigned char *from,
426
                                                 uint32_t max_length,
427
                                                 bool low_byte_first)
1 by brian
clean slate
428
  {
429
    return pack(to, from, max_length, low_byte_first);
430
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
431
  virtual const unsigned char *unpack_key(unsigned char* to,
432
                                          const unsigned char *from,
433
                                          uint32_t max_length,
434
                                          bool low_byte_first)
1 by brian
clean slate
435
  {
436
    return unpack(to, from, max_length, low_byte_first);
437
  }
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
438
  virtual uint32_t packed_col_length(const unsigned char *to, uint32_t length);
438.1.13 by Brian Aker
uint cleanup.
439
  virtual uint32_t max_packed_col_length(uint32_t max_length)
1 by brian
clean slate
440
  { return max_length;}
441
481 by Brian Aker
Remove all of uchar.
442
  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.
443
                       uint32_t key_length_arg,
444
                       bool insert_or_update);
481 by Brian Aker
Remove all of uchar.
445
  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.
446
                       uint32_t key_length_arg,
447
                       bool insert_or_update);
448
481 by Brian Aker
Remove all of uchar.
449
  uint32_t offset(unsigned char *record)
1 by brian
clean slate
450
  {
438.1.13 by Brian Aker
uint cleanup.
451
    return (uint32_t) (ptr - record);
1 by brian
clean slate
452
  }
453
  void copy_from_tmp(int offset);
438.1.13 by Brian Aker
uint cleanup.
454
  uint32_t fill_cache_field(struct st_cache_field *copy);
455
  virtual bool get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate);
236.1.24 by Monty Taylor
Renamed MYSQL_TIME to DRIZZLE_TIME.
456
  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.
457
  virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
458
  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
459
  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.
460
  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.
461
  { }
1 by brian
clean slate
462
  virtual enum Derivation derivation(void) const
463
  { return DERIVATION_IMPLICIT; }
212.1.3 by Monty Taylor
Renamed __attribute__((__unused__)) to __attribute__((unused)).
464
  virtual void set_derivation(enum Derivation derivation_arg __attribute__((unused)))
53.2.32 by Monty Taylor
First large swath at getting handler stuff clean.
465
  { }
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
466
  bool set_warning(DRIZZLE_ERROR::enum_warning_level, unsigned int code,
1 by brian
clean slate
467
                   int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
468
  void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code, 
469
                            const char *str, uint32_t str_len,
398.1.1 by Monty Taylor
Remove typedef enum enum_drizzle_timestamp_type timestamp_type;
470
                            enum enum_drizzle_timestamp_type ts_type, int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
471
  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;
472
                            int64_t nr, enum enum_drizzle_timestamp_type ts_type,
1 by brian
clean slate
473
                            int cuted_increment);
438.1.13 by Brian Aker
uint cleanup.
474
  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;
475
                            double nr, enum enum_drizzle_timestamp_type ts_type);
1 by brian
clean slate
476
  inline bool check_overflow(int op_result)
477
  {
478
    return (op_result == E_DEC_OVERFLOW);
479
  }
480
  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.
481
  void init(Table *table_arg);
1 by brian
clean slate
482
483
  /* maximum possible display length */
205 by Brian Aker
uint32 -> uin32_t
484
  virtual uint32_t max_display_length()= 0;
1 by brian
clean slate
485
438.1.13 by Brian Aker
uint cleanup.
486
  virtual uint32_t is_equal(Create_field *new_field);
152 by Brian Aker
longlong replacement
487
  /* convert decimal to int64_t with overflow check */
488
  int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
1 by brian
clean slate
489
                                    int *err);
490
  /* The max. number of characters */
205 by Brian Aker
uint32 -> uin32_t
491
  inline uint32_t char_length() const
1 by brian
clean slate
492
  {
493
    return field_length / charset()->mbmaxlen;
494
  }
495
496
  inline enum column_format_type column_format() const
497
  {
498
    return (enum column_format_type)
499
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
500
  }
501
502
  /* Hash value */
290 by Brian Aker
Update for ulong change over.
503
  virtual void hash(uint32_t *nr, uint32_t *nr2);
520.1.21 by Brian Aker
THD -> Session rename
504
  friend bool reopen_table(Session *,Table *,bool);
438.1.13 by Brian Aker
uint cleanup.
505
  friend int cre_myisam(char * name, register Table *form, uint32_t options,
1 by brian
clean slate
506
			uint64_t auto_increment_value);
507
  friend class Copy_field;
508
  friend class Item_avg_field;
509
  friend class Item_std_field;
510
  friend class Item_sum_num;
511
  friend class Item_sum_sum;
512
  friend class Item_sum_str;
513
  friend class Item_sum_count;
514
  friend class Item_sum_avg;
515
  friend class Item_sum_std;
516
  friend class Item_sum_min;
517
  friend class Item_sum_max;
518
  friend class Item_func_group_concat;
519
520
private:
521
  /*
522
    Primitive for implementing last_null_byte().
523
524
    SYNOPSIS
525
      do_last_null_byte()
526
527
    DESCRIPTION
528
      Primitive for the implementation of the last_null_byte()
529
      function. This represents the inheritance interface and can be
530
      overridden by subclasses.
531
   */
532
  virtual size_t do_last_null_byte() const;
533
534
/**
535
   Retrieve the field metadata for fields.
536
537
   This default implementation returns 0 and saves 0 in the metadata_ptr
538
   value.
539
540
   @param   metadata_ptr   First byte of field metadata
541
542
   @returns 0 no bytes written.
543
*/
481 by Brian Aker
Remove all of uchar.
544
  virtual int do_save_field_metadata(unsigned char *metadata_ptr __attribute__((unused)))
1 by brian
clean slate
545
  { return 0; }
546
};
547
548
/*
549
  Create field class for CREATE TABLE
550
*/
551
552
class Create_field :public Sql_alloc
553
{
554
public:
555
  const char *field_name;
556
  const char *change;			// If done with alter table
557
  const char *after;			// Put column after this one
558
  LEX_STRING comment;			// Comment for field
559
  Item	*def;				// Default value
560
  enum	enum_field_types sql_type;
561
  /*
562
    At various stages in execution this can be length of field in bytes or
563
    max number of characters. 
564
  */
290 by Brian Aker
Update for ulong change over.
565
  uint32_t length;
1 by brian
clean slate
566
  /*
567
    The value of `length' as set by parser: is the number of characters
568
    for most of the types, or of bytes for BLOBs or numeric types.
569
  */
205 by Brian Aker
uint32 -> uin32_t
570
  uint32_t char_length;
438.1.13 by Brian Aker
uint cleanup.
571
  uint32_t  decimals, flags, pack_length, key_length;
1 by brian
clean slate
572
  Field::utype unireg_check;
573
  TYPELIB *interval;			// Which interval to use
574
  TYPELIB *save_interval;               // Temporary copy for the above
575
                                        // Used only for UCS2 intervals
576
  List<String> interval_list;
264.2.6 by Andrey Hristov
Constify the usage of CHARSET_INFO almost to the last place in the code.
577
  const CHARSET_INFO *charset;
1 by brian
clean slate
578
  Field *field;				// For alter table
579
206 by Brian Aker
Removed final uint dead types.
580
  uint8_t row,col,sc_length,interval_id;	// For rea_create_table
438.1.13 by Brian Aker
uint cleanup.
581
  uint32_t	offset,pack_flag;
383.7.1 by Andrey Zhakov
Initial submit of code and tests
582
583
  /* Virtual column expression statement */
584
  virtual_column_info *vcol_info;
585
  /*
586
    Indication that the field is phycically stored in tables 
587
    rather than just generated on SQL queries.
588
    As of now, FALSE can only be set for generated-only virtual columns.
589
  */
590
  bool is_stored;
591
1 by brian
clean slate
592
  Create_field() :after(0) {}
593
  Create_field(Field *field, Field *orig_field);
594
  /* Used to make a clone of this object for ALTER/CREATE TABLE */
595
  Create_field *clone(MEM_ROOT *mem_root) const
596
    { return new (mem_root) Create_field(*this); }
597
  void create_length_to_internal_length(void);
598
599
  inline enum column_format_type column_format() const
600
  {
601
    return (enum column_format_type)
602
      ((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
603
  }
604
605
  /* Init for a tmp table field. To be extended if need be. */
606
  void init_for_tmp_table(enum_field_types sql_type_arg,
205 by Brian Aker
uint32 -> uin32_t
607
                          uint32_t max_length, uint32_t decimals,
1 by brian
clean slate
608
                          bool maybe_null, bool is_unsigned);
609
520.1.22 by Brian Aker
Second pass of thd cleanup
610
  bool init(Session *session, char *field_name, enum_field_types type, char *length,
438.1.13 by Brian Aker
uint cleanup.
611
            char *decimals, uint32_t type_modifier, Item *default_value,
1 by brian
clean slate
612
            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.
613
            List<String> *interval_list, const CHARSET_INFO * const cs,
438.1.13 by Brian Aker
uint cleanup.
614
            uint32_t uint_geom_type,
383.7.1 by Andrey Zhakov
Initial submit of code and tests
615
            enum column_format_type column_format,
616
            virtual_column_info *vcol_info);
1 by brian
clean slate
617
};
618
619
620
/*
621
  A class for sending info to the client
622
*/
623
624
class Send_field {
625
 public:
626
  const char *db_name;
627
  const char *table_name,*org_table_name;
628
  const char *col_name,*org_col_name;
290 by Brian Aker
Update for ulong change over.
629
  uint32_t length;
438.1.13 by Brian Aker
uint cleanup.
630
  uint32_t charsetnr, flags, decimals;
1 by brian
clean slate
631
  enum_field_types type;
632
  Send_field() {}
633
};
634
635
636
/*
637
  A class for quick copying data to fields
638
*/
639
640
class Copy_field :public Sql_alloc {
641
  /**
642
    Convenience definition of a copy function returned by
643
    get_copy_func.
644
  */
645
  typedef void Copy_func(Copy_field*);
646
  Copy_func *get_copy_func(Field *to, Field *from);
647
public:
481 by Brian Aker
Remove all of uchar.
648
  unsigned char *from_ptr,*to_ptr;
649
  unsigned char *from_null_ptr,*to_null_ptr;
274 by Brian Aker
my_bool conversion in Table
650
  bool *null_row;
438.1.13 by Brian Aker
uint cleanup.
651
  uint32_t	from_bit,to_bit;
652
  uint32_t from_length,to_length;
1 by brian
clean slate
653
  Field *from_field,*to_field;
654
  String tmp;					// For items
655
656
  Copy_field() {}
657
  ~Copy_field() {}
658
  void set(Field *to,Field *from,bool save);	// Field to field 
481 by Brian Aker
Remove all of uchar.
659
  void set(unsigned char *to,Field *from);		// Field to string
1 by brian
clean slate
660
  void (*do_copy)(Copy_field *);
661
  void (*do_copy2)(Copy_field *);		// Used to handle null values
662
};
663
664
481 by Brian Aker
Remove all of uchar.
665
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
575.4.7 by Monty Taylor
More header cleanup.
666
                  unsigned char *null_pos, unsigned char null_bit,
667
                  uint32_t pack_flag, enum_field_types field_type,
668
                  const CHARSET_INFO * cs,
669
                  Field::utype unireg_check,
670
                  TYPELIB *interval, const char *field_name);
671
438.1.13 by Brian Aker
uint cleanup.
672
uint32_t pack_length_to_packflag(uint32_t type);
290 by Brian Aker
Update for ulong change over.
673
enum_field_types get_blob_type_from_length(uint32_t length);
205 by Brian Aker
uint32 -> uin32_t
674
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
1 by brian
clean slate
675
int set_field_to_null(Field *field);
676
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
677
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
678
483.1.4 by Lee
break out Field_longstr
679
bool
680
test_if_important_data(const CHARSET_INFO * const cs, 
681
		       const char *str,
682
                       const char *strend);
683
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
684
/*
685
  Field subclasses
686
 */
483.1.5 by Lee
clean up code for Field_str
687
#include <drizzled/field/str.h>
483.1.4 by Lee
break out Field_longstr
688
#include <drizzled/field/longstr.h>
483.1.6 by Lee
code clean up for Field_num
689
#include <drizzled/field/num.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
690
#include <drizzled/field/blob.h>
438.4.1 by Lee
breaking out enum field classes
691
#include <drizzled/field/enum.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
692
#include <drizzled/field/null.h>
693
#include <drizzled/field/date.h>
694
#include <drizzled/field/fdecimal.h>
483.1.1 by Lee
latest code cleanup for Field_real
695
#include <drizzled/field/real.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
696
#include <drizzled/field/double.h>
697
#include <drizzled/field/long.h>
698
#include <drizzled/field/int64_t.h>
483.1.6 by Lee
code clean up for Field_num
699
#include <drizzled/field/num.h>
214 by Brian Aker
Rename of fields (fix issue with string and decimal .h clashing).
700
#include <drizzled/field/timetype.h>
701
#include <drizzled/field/timestamp.h>
702
#include <drizzled/field/datetime.h>
703
#include <drizzled/field/fstring.h>
704
#include <drizzled/field/varstring.h>
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
705
1 by brian
clean slate
706
/*
707
  The following are for the interface with the .frm file
708
*/
709
710
#define FIELDFLAG_DECIMAL		1
711
#define FIELDFLAG_BINARY		1	// Shares same flag
712
#define FIELDFLAG_NUMBER		2
216 by Brian Aker
Remove completely ZEROFILL
713
#define FIELDFLAG_DECIMAL_POSITION      4
1 by brian
clean slate
714
#define FIELDFLAG_PACK			120	// Bits used for packing
715
#define FIELDFLAG_INTERVAL		256     // mangled with decimals!
716
#define FIELDFLAG_BLOB			1024	// mangled with decimals!
520 by Brian Aker
Remove dead field defines (and dropped a dead function for SP).
717
1 by brian
clean slate
718
#define FIELDFLAG_NO_DEFAULT		16384   /* sql */
438.1.13 by Brian Aker
uint cleanup.
719
#define FIELDFLAG_SUM			((uint32_t) 32768)// predit: +#fieldflag
720
#define FIELDFLAG_MAYBE_NULL		((uint32_t) 32768)// sql
721
#define FIELDFLAG_HEX_ESCAPE		((uint32_t) 0x10000)
1 by brian
clean slate
722
#define FIELDFLAG_PACK_SHIFT		3
723
#define FIELDFLAG_DEC_SHIFT		8
724
#define FIELDFLAG_MAX_DEC		31
725
726
#define MTYP_TYPENR(type) (type & 127)	/* Remove bits from type */
727
728
#define f_is_dec(x)		((x) & FIELDFLAG_DECIMAL)
729
#define f_is_num(x)		((x) & FIELDFLAG_NUMBER)
216 by Brian Aker
Remove completely ZEROFILL
730
#define f_is_decimal_precision(x)	((x) & FIELDFLAG_DECIMAL_POSITION)
1 by brian
clean slate
731
#define f_is_packed(x)		((x) & FIELDFLAG_PACK)
732
#define f_packtype(x)		(((x) >> FIELDFLAG_PACK_SHIFT) & 15)
206 by Brian Aker
Removed final uint dead types.
733
#define f_decimals(x)		((uint8_t) (((x) >> FIELDFLAG_DEC_SHIFT) & FIELDFLAG_MAX_DEC))
1 by brian
clean slate
734
#define f_is_alpha(x)		(!f_is_num(x))
735
#define f_is_binary(x)          ((x) & FIELDFLAG_BINARY) // 4.0- compatibility
736
#define f_is_enum(x)            (((x) & (FIELDFLAG_INTERVAL | FIELDFLAG_NUMBER)) == FIELDFLAG_INTERVAL)
737
#define f_is_blob(x)		(((x) & (FIELDFLAG_BLOB | FIELDFLAG_NUMBER)) == FIELDFLAG_BLOB)
738
#define f_is_equ(x)		((x) & (1+2+FIELDFLAG_PACK+31*256))
520 by Brian Aker
Remove dead field defines (and dropped a dead function for SP).
739
#define f_settype(x)   (((int) x) << FIELDFLAG_PACK_SHIFT)
1 by brian
clean slate
740
#define f_maybe_null(x)		(x & FIELDFLAG_MAYBE_NULL)
741
#define f_no_default(x)		(x & FIELDFLAG_NO_DEFAULT)
742
#define f_is_hex_escape(x)      ((x) & FIELDFLAG_HEX_ESCAPE)
173.1.3 by Toru Maesaka
ripped out datetime and moved to field/
743
483.1.5 by Lee
clean up code for Field_str
744
bool
745
check_string_copy_error(Field_str *field,
746
                        const char *well_formed_error_pos,
747
                        const char *cannot_convert_error_pos,
748
                        const char *end,
749
                        const CHARSET_INFO * const cs);
520.8.2 by Monty Taylor
Moved sql_parse.h and sql_error.h out of common_includes.
750
751
#endif /* DRIZZLED_FIELD_H */