22
22
variables must declare the size_of() member function.
27
25
#ifndef DRIZZLED_FIELD_H
28
26
#define DRIZZLED_FIELD_H
30
28
#include <drizzled/sql_error.h>
31
#include <drizzled/type/decimal.h>
32
#include <drizzled/key_map.h>
29
#include <drizzled/my_decimal.h>
30
#include <drizzled/sql_bitmap.h>
33
31
#include <drizzled/sql_list.h>
34
#include <drizzled/structs.h>
35
#include <drizzled/charset_info.h>
36
#include <drizzled/item_result.h>
37
#include <drizzled/charset_info.h>
42
#include <drizzled/visibility.h>
47
34
#define DATETIME_DEC 6
48
35
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
51
#define ASSERT_COLUMN_MARKED_FOR_READ assert(!getTable() || (getTable()->read_set == NULL || isReadSet()))
52
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(!getTable() || (getTable()->write_set == NULL || isWriteSet()))
54
#define ASSERT_COLUMN_MARKED_FOR_READ assert(getTable())
55
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(getTable())
58
typedef struct st_typelib TYPELIB;
60
37
const uint32_t max_field_size= (uint32_t) 4294967295U;
43
class virtual_column_info;
45
typedef struct st_table_share TABLE_SHARE;
47
struct st_cache_field;
68
48
int field_conv(Field *to,Field *from);
71
* Class representing a Field in a Table
75
* The value stored in the Field object is stored in the
76
* unsigned char pointer member variable called ptr. The
77
* val_xxx() methods retrieve this raw byte value and
78
* convert the byte into the appropriate output (int, decimal, etc).
80
* The store_xxx() methods take various input and convert
81
* the input into the raw bytes stored in the ptr member variable.
83
class DRIZZLED_API Field
85
/* Prevent use of these */
50
inline uint32_t get_enum_pack_length(int elements)
52
return elements < 256 ? 1 : 2;
55
inline uint32_t get_set_pack_length(int elements)
57
uint32_t len= (elements + 7) / 8;
58
return len > 4 ? 8 : len;
63
Field(const Item &); /* Prevent use of these */
87
64
void operator=(Field &);
90
unsigned char *ptr; /**< Position to field in record. Stores raw field value */
91
unsigned char *null_ptr; /**< Byte where null_bit is */
94
* Pointer to the Table object containing this Field
96
* @note You can use table->in_use as replacement for current_session member
97
* only inside of val_*() and store() members (e.g. you can't use it in cons)
109
Table *getTable() const
115
void setTable(Table *table_arg)
120
Table *orig_table; /**< Pointer to the original Table. @TODO What is "the original table"? */
121
const char *field_name; /**< Name of the field */
122
LEX_STRING comment; /**< A comment about the field */
124
/** The field is part of the following keys */
127
key_map part_of_key_not_clustered;
128
key_map part_of_sortkey;
131
We use three additional unireg types for TIMESTAMP for hysterical
132
raisins and limitations in the MySQL FRM file format.
134
A good TODO is to clean this up as we can support just about
135
anything in the table proto message now.
148
uint32_t field_length; /**< Length of this field in bytes */
151
bool isUnsigned() const
153
return flags & UNSIGNED_FLAG;
157
uint16_t field_index; /**< Index of this Field in Table::fields array */
161
uint16_t position() const
166
void setPosition(uint32_t arg)
171
unsigned char null_bit; /**< Bit used to test null bit */
66
static void *operator new(size_t size) {return sql_alloc(size); }
67
static void operator delete(void *, size_t)
68
{ TRASH(ptr_arg, size); }
70
unsigned char *ptr; // Position to field in record
71
unsigned char *null_ptr; // Byte where null_bit is
73
Note that you can use table->in_use as replacement for current_session member
74
only inside of val_*() and store() members (e.g. you can't use it in cons)
76
Table *table; // Pointer for table
77
Table *orig_table; // Pointer to original table
78
const char **table_name, *field_name;
80
/* Field is part of the following keys */
81
key_map key_start, part_of_key, part_of_key_not_clustered;
82
key_map part_of_sortkey;
84
We use three additional unireg types for TIMESTAMP to overcome limitation
85
of current binary format of .frm file. We'd like to be able to support
86
NOW() as default and on update value for such fields but unable to hold
87
this info anywhere except unireg_check field. This issue will be resolved
88
in more clean way with transition to new text based .frm format.
89
See also comment for Field_timestamp::Field_timestamp().
91
enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
92
CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
93
BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD,
94
TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD};
95
enum imagetype { itRAW, itMBR};
98
uint32_t field_length; // Length of field
100
uint16_t field_index; // field number in fields array
101
unsigned char null_bit; // Bit used to test null bit
173
103
If true, this field was created in create_tmp_field_from_item from a NULL
174
104
value. This means that the type of the field is just a guess, and the type
177
107
@see create_tmp_field_from_item
178
108
@see Item_type_holder::get_real_type
180
111
bool is_created_from_null_item;
182
static void *operator new(size_t size);
183
static void *operator new(size_t size, memory::Root *mem_root);
184
static void operator delete(void *, size_t)
186
static void operator delete(void *, memory::Root *)
113
/* Virtual column data */
114
virtual_column_info *vcol_info;
116
Indication that the field is physically stored in tables
117
rather than just generated on SQL queries.
118
As of now, false can only be set for generated-only virtual columns.
189
Field(unsigned char *ptr_arg,
191
unsigned char *null_ptr_arg,
192
unsigned char null_bit_arg,
193
utype unireg_check_arg,
122
Field(unsigned char *ptr_arg,uint32_t length_arg,unsigned char *null_ptr_arg,
123
unsigned char null_bit_arg, utype unireg_check_arg,
194
124
const char *field_name_arg);
195
125
virtual ~Field() {}
197
bool hasDefault() const
199
return not (flags & NO_DEFAULT_VALUE_FLAG);
202
126
/* Store functions returns 1 on overflow and -1 on fatal error */
203
virtual int store(const char *to,
205
const CHARSET_INFO * const cs)=0;
206
virtual int store(double nr)=0;
207
virtual int store(int64_t nr, bool unsigned_val)=0;
208
virtual int store_decimal(const type::Decimal *d)=0;
209
int store_and_check(enum_check_fields check_level,
212
const CHARSET_INFO * const cs);
214
This is called when storing a date in a string.
217
Needs to be changed if/when we want to support different time formats.
219
virtual int store_time(type::Time <ime, type::timestamp_t t_type);
220
virtual double val_real() const=0;
221
virtual int64_t val_int() const =0;
222
virtual type::Decimal *val_decimal(type::Decimal *) const;
223
String *val_str_internal(String *str) const
225
return val_str(str, str);
127
virtual int store(const char *to, uint32_t length,
128
const CHARSET_INFO * const cs)=0;
129
virtual int store(double nr)=0;
130
virtual int store(int64_t nr, bool unsigned_val)=0;
131
virtual int store_decimal(const my_decimal *d)=0;
132
virtual int store_time(DRIZZLE_TIME *ltime,
133
enum enum_drizzle_timestamp_type t_type);
134
int store(const char *to, uint32_t length, const CHARSET_INFO * const cs,
135
enum_check_fields check_level);
136
virtual double val_real(void)=0;
137
virtual int64_t val_int(void)=0;
138
virtual my_decimal *val_decimal(my_decimal *);
139
inline String *val_str(String *str) { return val_str(str, str); }
229
141
val_str(buf1, buf2) gets two buffers and should use them as follows:
230
142
if it needs a temp buffer to convert result to string - use buf1
284
186
static Item_result result_merge_type(enum_field_types);
286
188
virtual bool eq(Field *field);
288
* Returns true if the fields are equally defined
291
* true This Field is equally defined to supplied Field
293
* false This Field is NOT equally defined to supplied Field
295
189
virtual bool eq_def(Field *field);
297
virtual bool is_timestamp() const
303
* Returns size (in bytes) used to store field data in memory
304
* (i.e. it returns the maximum size of the field in a row of the table,
305
* which is located in RAM).
192
pack_length() returns size (in bytes) used to store field data in memory
193
(i.e. it returns the maximum size of the field in a row of the table,
194
which is located in RAM).
307
196
virtual uint32_t pack_length() const;
310
* Returns size (in bytes) used to store field data on
311
* storage (i.e. it returns the maximal size of the field in a row of the
312
* table, which is located on disk).
199
pack_length_in_rec() returns size (in bytes) used to store field data on
200
storage (i.e. it returns the maximal size of the field in a row of the
201
table, which is located on disk).
314
203
virtual uint32_t pack_length_in_rec() const;
317
* Return the "real size" of the data in memory.
318
* For varstrings, this does _not_ include the length bytes.
204
virtual int compatible_field_size(uint32_t field_metadata);
205
virtual uint32_t pack_length_from_metadata(uint32_t field_metadata);
208
This method is used to return the size of the data in a row-based
209
replication row record. The default implementation of returning 0 is
210
designed to allow fields that do not use metadata to return true (1)
211
from compatible_field_size() which uses this function in the comparison.
212
The default value for field metadata for fields that do not have
213
metadata is 0. Thus, 0 == 0 means the fields are compatible in size.
215
Note: While most classes that override this method return pack_length(),
216
the classes Field_varstring, and Field_blob return
217
field_length + 1, field_length, and pack_length_no_ptr() respectfully.
219
virtual uint32_t row_pack_length();
220
virtual int save_field_metadata(unsigned char *first_byte);
223
data_length() return the "real size" of the data in memory.
224
For varstrings, this does _not_ include the length bytes.
320
226
virtual uint32_t data_length();
322
* Returns the number of bytes actually used to store the data
323
* of the field. So for a varstring it includes both lenght byte(s) and
324
* string data, and anything after data_length() bytes are unused.
228
used_length() returns the number of bytes actually used to store the data
229
of the field. So for a varstring it includes both lenght byte(s) and
230
string data, and anything after data_length() bytes are unused.
326
232
virtual uint32_t used_length();
327
233
virtual uint32_t sort_length() const;
364
271
virtual uint32_t size_of() const =0;
366
bool is_null(ptrdiff_t row_offset= 0) const;
367
bool is_real_null(ptrdiff_t row_offset= 0) const;
368
bool is_null_in_record(const unsigned char *record) const;
369
bool is_null_in_record_with_offset(ptrdiff_t offset) const;
370
void set_null(ptrdiff_t row_offset= 0);
371
void set_notnull(ptrdiff_t row_offset= 0);
372
bool maybe_null(void) const;
373
bool real_maybe_null(void) const;
375
virtual void make_field(SendField *);
273
bool is_null(my_ptrdiff_t row_offset= 0);
274
bool is_real_null(my_ptrdiff_t row_offset= 0);
275
bool is_null_in_record(const unsigned char *record);
276
bool is_null_in_record_with_offset(my_ptrdiff_t offset);
277
void set_null(my_ptrdiff_t row_offset= 0);
278
void set_notnull(my_ptrdiff_t row_offset= 0);
279
bool maybe_null(void);
280
bool real_maybe_null(void);
283
LAST_NULL_BYTE_UNDEF= 0
287
Find the position of the last null byte for the field.
293
Return a pointer to the last byte of the null bytes where the
294
field conceptually is placed.
297
The position of the last null byte relative to the beginning of
298
the record. If the field does not use any bits of the null
299
bytes, the value 0 (LAST_NULL_BYTE_UNDEF) is returned.
301
size_t last_null_byte() const;
303
virtual void make_field(Send_field *);
376
304
virtual void sort_string(unsigned char *buff,uint32_t length)=0;
377
305
virtual bool optimize_range(uint32_t idx, uint32_t part);
379
* Returns true for fields which, when compared with constant
380
* items, can be casted to int64_t. In this case we will at 'fix_fields'
381
* stage cast the constant items to int64_ts and at the execution stage
382
* use field->val_int() for comparison. Used to optimize clauses like
383
* 'a_column BETWEEN date_const AND date_const'.
385
virtual bool can_be_compared_as_int64_t() const
307
This should be true for fields which, when compared with constant
308
items, can be casted to int64_t. In this case we will at 'fix_fields'
309
stage cast the constant items to int64_ts and at the execution stage
310
use field->val_int() for comparison. Used to optimize clauses like
311
'a_column BETWEEN date_const, date_const'.
313
virtual bool can_be_compared_as_int64_t() const { return false; }
389
314
virtual void free() {}
390
virtual Field *new_field(memory::Root *root,
315
virtual Field *new_field(MEM_ROOT *root, Table *new_table,
393
virtual Field *new_key_field(memory::Root *root, Table *new_table,
394
unsigned char *new_ptr,
395
unsigned char *new_null_ptr,
317
virtual Field *new_key_field(MEM_ROOT *root, Table *new_table,
318
unsigned char *new_ptr, unsigned char *new_null_ptr,
396
319
uint32_t new_null_bit);
397
/** This is used to generate a field in Table from TableShare */
398
Field *clone(memory::Root *mem_root, Table *new_table);
399
void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
320
Field *clone(MEM_ROOT *mem_root, Table *new_table);
321
inline void move_field(unsigned char *ptr_arg,unsigned char *null_ptr_arg,unsigned char null_bit_arg)
402
null_ptr= null_ptr_arg;
403
null_bit= null_bit_arg;
323
ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
405
void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
406
virtual void move_field_offset(ptrdiff_t ptr_diff)
325
inline void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
326
virtual void move_field_offset(my_ptrdiff_t ptr_diff)
408
ptr= ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
328
ptr=ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
410
null_ptr= ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
412
virtual void get_image(unsigned char *buff, uint32_t length, const CHARSET_INFO * const)
414
memcpy(buff,ptr,length);
416
virtual void get_image(std::basic_string<unsigned char> &buff, uint32_t length, const CHARSET_INFO * const)
418
buff.append(ptr,length);
420
virtual void set_image(const unsigned char *buff,uint32_t length, const CHARSET_INFO * const)
422
memcpy(ptr,buff,length);
426
* Copy a field part into an output buffer.
430
* This function makes a copy of field part of size equal to or
431
* less than "length" parameter value.
432
* For fields of string types (VARCHAR, TEXT) the rest of buffer
433
* is padded by zero byte.
435
* @param output buffer
436
* @param output buffer size
440
* For variable length character fields (i.e. UTF-8) the "length"
441
* parameter means a number of output buffer bytes as if all field
442
* characters have maximal possible size (mbmaxlen). In the other words,
443
* "length" parameter is a number of characters multiplied by
444
* field_charset->mbmaxlen.
447
* Number of copied bytes (excluding padded zero bytes -- see above).
449
virtual uint32_t get_key_image(unsigned char *buff, uint32_t length)
330
null_ptr=ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
332
virtual void get_image(unsigned char *buff, uint32_t length,
333
const CHARSET_INFO * const)
334
{ memcpy(buff,ptr,length); }
335
virtual void get_image(std::basic_string<unsigned char> &buff,
337
const CHARSET_INFO * const)
338
{ buff.append(ptr,length); }
339
virtual void set_image(const unsigned char *buff,uint32_t length,
340
const CHARSET_INFO * const)
341
{ memcpy(ptr,buff,length); }
345
Copy a field part into an output buffer.
348
Field::get_key_image()
349
buff [out] output buffer
350
length output buffer size
351
type itMBR for geometry blobs, otherwise itRAW
354
This function makes a copy of field part of size equal to or
355
less than "length" parameter value.
356
For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
357
is padded by zero byte.
360
For variable length character fields (i.e. UTF-8) the "length"
361
parameter means a number of output buffer bytes as if all field
362
characters have maximal possible size (mbmaxlen). In the other words,
363
"length" parameter is a number of characters multiplied by
364
field_charset->mbmaxlen.
367
Number of copied bytes (excluding padded zero bytes -- see above).
370
virtual uint32_t get_key_image(unsigned char *buff, uint32_t length, imagetype)
451
372
get_image(buff, length, &my_charset_bin);
454
virtual uint32_t get_key_image(std::basic_string<unsigned char> &buff, uint32_t length)
375
virtual uint32_t get_key_image(std::basic_string<unsigned char> &buff,
376
uint32_t length, imagetype)
456
378
get_image(buff, length, &my_charset_bin);
459
381
virtual void set_key_image(const unsigned char *buff,uint32_t length)
461
set_image(buff,length, &my_charset_bin);
463
int64_t val_int_offset(uint32_t row_offset)
466
int64_t tmp=val_int();
471
int64_t val_int_internal(const unsigned char *new_ptr)
382
{ set_image(buff,length, &my_charset_bin); }
383
inline int64_t val_int_offset(uint32_t row_offset)
386
int64_t tmp=val_int();
390
inline int64_t val_int(const unsigned char *new_ptr)
473
392
unsigned char *old_ptr= ptr;
474
ptr= const_cast<unsigned char*>(new_ptr);
475
int64_t return_value= val_int();
393
int64_t return_value;
394
ptr= (unsigned char*) new_ptr;
395
return_value= val_int();
477
397
return return_value;
480
String *val_str_internal(String *str, const unsigned char *new_ptr)
399
inline String *val_str(String *str, const unsigned char *new_ptr)
482
401
unsigned char *old_ptr= ptr;
483
ptr= const_cast<unsigned char*>(new_ptr);
484
val_str_internal(str);
402
ptr= (unsigned char*) new_ptr;
407
virtual bool send_binary(Protocol *protocol);
409
virtual unsigned char *pack(unsigned char *to, const unsigned char *from,
410
uint32_t max_length, bool low_byte_first);
490
Pack the field into a format suitable for storage and transfer.
492
To implement packing functionality, only the virtual function
493
should be overridden. The other functions are just convenience
494
functions and hence should not be overridden.
496
The value of <code>low_byte_first</code> is dependent on how the
497
packed data is going to be used: for local use, e.g., temporary
498
store on disk or in memory, use the native format since that is
499
faster. For data that is going to be transfered to other machines
500
(e.g., when writing data to the binary log), data should always be
501
stored in little-endian format.
503
@note The default method for packing fields just copy the raw bytes
504
of the record into the destination, but never more than
505
<code>max_length</code> characters.
508
Pointer to memory area where representation of field should be put.
511
Pointer to memory area where record representation of field is
515
Maximum length of the field, as given in the column definition. For
516
example, for <code>CHAR(1000)</code>, the <code>max_length</code>
517
is 1000. This information is sometimes needed to decide how to pack
520
@param low_byte_first
521
@c true if integers should be stored little-endian, @c false if
522
native format should be used. Note that for little-endian machines,
523
the value of this flag is a moot point since the native format is
412
@overload Field::pack(unsigned char*, const unsigned char*,
526
virtual unsigned char *pack(unsigned char *to,
527
const unsigned char *from,
529
bool low_byte_first);
531
415
unsigned char *pack(unsigned char *to, const unsigned char *from);
534
Unpack a field from row data.
536
This method is used to unpack a field from a master whose size of
537
the field is less than that of the slave.
539
The <code>param_data</code> parameter is a two-byte integer (stored
540
in the least significant 16 bits of the unsigned integer) usually
541
consisting of two parts: the real type in the most significant byte
542
and a original pack length in the least significant byte.
544
The exact layout of the <code>param_data</code> field is given by
545
the <code>Table_map_log_event::save_field_metadata()</code>.
547
This is the default method for unpacking a field. It just copies
548
the memory block in byte order (of original pack length bytes or
549
length of field, whichever is smaller).
551
@param to Destination of the data
552
@param from Source of the data
553
@param param_data Real type and original pack length of the field
556
@param low_byte_first
557
If this flag is @c true, all composite entities (e.g., lengths)
558
should be unpacked in little-endian format; otherwise, the entities
559
are unpacked in native order.
561
@return New pointer into memory based on from + length of the data
563
417
virtual const unsigned char *unpack(unsigned char* to,
564
418
const unsigned char *from,
565
419
uint32_t param_data,
586
444
return unpack(to, from, max_length, low_byte_first);
446
virtual uint32_t packed_col_length(const unsigned char *to, uint32_t length);
588
447
virtual uint32_t max_packed_col_length(uint32_t max_length)
593
uint32_t offset(const unsigned char *record)
448
{ return max_length;}
450
virtual int pack_cmp(const unsigned char *a,const unsigned char *b,
451
uint32_t key_length_arg,
452
bool insert_or_update);
453
virtual int pack_cmp(const unsigned char *b,
454
uint32_t key_length_arg,
455
bool insert_or_update);
457
uint32_t offset(unsigned char *record)
595
459
return (uint32_t) (ptr - record);
597
461
void copy_from_tmp(int offset);
598
uint32_t fill_cache_field(CacheField *copy);
599
virtual bool get_date(type::Time <ime,uint32_t fuzzydate) const;
600
virtual bool get_time(type::Time <ime) const;
462
uint32_t fill_cache_field(struct st_cache_field *copy);
463
virtual bool get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate);
464
virtual bool get_time(DRIZZLE_TIME *ltime);
601
465
virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
602
466
virtual const CHARSET_INFO *sort_charset(void) const { return charset(); }
603
467
virtual bool has_charset(void) const { return false; }
604
468
virtual void set_charset(const CHARSET_INFO * const)
606
470
virtual enum Derivation derivation(void) const
608
return DERIVATION_IMPLICIT;
471
{ return DERIVATION_IMPLICIT; }
610
472
virtual void set_derivation(enum Derivation)
613
Produce warning or note about data saved into field.
615
@param level - level of message (Note/Warning/Error)
616
@param code - error code of message to be produced
617
@param cuted_increment - whenever we should increase cut fields count or not
620
This function won't produce warning and increase cut fields counter
621
if count_cuted_fields == CHECK_FIELD_IGNORE for current thread.
623
if count_cuted_fields == CHECK_FIELD_IGNORE then we ignore notes.
624
This allows us to avoid notes in optimisation, like convert_constant_item().
627
1 if count_cuted_fields == CHECK_FIELD_IGNORE and error level is not NOTE
631
bool set_warning(DRIZZLE_ERROR::enum_warning_level,
632
drizzled::error_t code,
474
bool set_warning(DRIZZLE_ERROR::enum_warning_level, unsigned int code,
633
475
int cuted_increment);
635
Produce warning or note about datetime string data saved into field.
637
@param level level of message (Note/Warning/Error)
638
@param code error code of message to be produced
639
@param str string value which we tried to save
640
@param str_length length of string which we tried to save
641
@param ts_type type of datetime value (datetime/date/time)
642
@param cuted_increment whenever we should increase cut fields count or not
645
This function will always produce some warning but won't increase cut
646
fields counter if count_cuted_fields ==FIELD_CHECK_IGNORE for current
649
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
650
drizzled::error_t code,
653
type::timestamp_t ts_type,
654
int cuted_increment);
656
Produce warning or note about integer datetime value saved into field.
658
@param level level of message (Note/Warning/Error)
659
@param code error code of message to be produced
660
@param nr numeric value which we tried to save
661
@param ts_type type of datetime value (datetime/date/time)
662
@param cuted_increment whenever we should increase cut fields count or not
665
This function will always produce some warning but won't increase cut
666
fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
669
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
670
drizzled::error_t code,
672
type::timestamp_t ts_type,
673
int cuted_increment);
675
Produce warning or note about double datetime data saved into field.
677
@param level level of message (Note/Warning/Error)
678
@param code error code of message to be produced
679
@param nr double value which we tried to save
680
@param ts_type type of datetime value (datetime/date/time)
683
This function will always produce some warning but won't increase cut
684
fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
687
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
688
const drizzled::error_t code,
690
type::timestamp_t ts_type);
691
bool check_overflow(int op_result)
476
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code,
477
const char *str, uint32_t str_len,
478
enum enum_drizzle_timestamp_type ts_type, int cuted_increment);
479
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code,
480
int64_t nr, enum enum_drizzle_timestamp_type ts_type,
481
int cuted_increment);
482
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, const uint32_t code,
483
double nr, enum enum_drizzle_timestamp_type ts_type);
484
inline bool check_overflow(int op_result)
693
486
return (op_result == E_DEC_OVERFLOW);
696
Process decimal library return codes and issue warnings for overflow and
699
@param op_result decimal library return code (E_DEC_* see include/decimal.h)
702
E_DEC_OVERFLOW there was overflow
703
E_DEC_TRUNCATED there was truncation
705
0 no error or there was some other error except overflow or truncation
707
488
int warn_if_overflow(int op_result);
708
489
void init(Table *table_arg);
710
491
/* maximum possible display length */
711
492
virtual uint32_t max_display_length()= 0;
713
virtual uint32_t is_equal(CreateField *new_field);
715
Conversion from decimal to int64_t with checking overflow and
716
setting correct value (min/max) in case of overflow.
718
@param val value which have to be converted
719
@param unsigned_flag type of integer in which we convert val
720
@param err variable to pass error code
723
value converted from val
725
int64_t convert_decimal2int64_t(const type::Decimal *val,
494
virtual uint32_t is_equal(Create_field *new_field);
495
/* convert decimal to int64_t with overflow check */
496
int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
728
498
/* The max. number of characters */
729
uint32_t char_length() const
499
inline uint32_t char_length() const
731
501
return field_length / charset()->mbmaxlen;
734
enum column_format_type column_format() const
504
inline enum column_format_type column_format() const
736
506
return (enum column_format_type)
737
507
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
741
virtual void hash(uint32_t *nr, uint32_t *nr2) const;
511
virtual void hash(uint32_t *nr, uint32_t *nr2);
742
512
friend bool reopen_table(Session *,Table *,bool);
744
friend class CopyField;
513
friend int cre_myisam(char * name, register Table *form, uint32_t options,
514
uint64_t auto_increment_value);
515
friend class Copy_field;
745
516
friend class Item_avg_field;
746
517
friend class Item_std_field;
747
518
friend class Item_sum_num;
754
525
friend class Item_sum_max;
755
526
friend class Item_func_group_concat;
757
bool isReadSet() const;
759
void setReadSet(bool arg= true);
760
void setWriteSet(bool arg= true);
764
void pack_num(uint64_t arg, unsigned char *destination= NULL);
765
void pack_num(uint32_t arg, unsigned char *destination= NULL);
766
uint64_t unpack_num(uint64_t &destination, const unsigned char *arg= NULL) const;
767
uint32_t unpack_num(uint32_t &destination, const unsigned char *arg= NULL) const;
530
Primitive for implementing last_null_byte().
536
Primitive for the implementation of the last_null_byte()
537
function. This represents the inheritance interface and can be
538
overridden by subclasses.
540
virtual size_t do_last_null_byte() const;
543
Retrieve the field metadata for fields.
545
This default implementation returns 0 and saves 0 in the metadata_ptr
548
@param metadata_ptr First byte of field metadata
550
@returns 0 no bytes written.
552
virtual int do_save_field_metadata(unsigned char *)
557
Create field class for CREATE TABLE
772
inline bool isDateTime(const enum_field_types &arg)
560
class Create_field :public Sql_alloc
563
const char *field_name;
564
const char *change; // If done with alter table
565
const char *after; // Put column after this one
566
LEX_STRING comment; // Comment for field
567
Item *def; // Default value
568
enum enum_field_types sql_type;
570
At various stages in execution this can be length of field in bytes or
571
max number of characters.
575
The value of `length' as set by parser: is the number of characters
576
for most of the types, or of bytes for BLOBs or numeric types.
578
uint32_t char_length;
579
uint32_t decimals, flags, pack_length, key_length;
580
Field::utype unireg_check;
581
TYPELIB *interval; // Which interval to use
582
TYPELIB *save_interval; // Temporary copy for the above
583
// Used only for UCS2 intervals
584
List<String> interval_list;
585
const CHARSET_INFO *charset;
586
Field *field; // For alter table
588
uint8_t row,col,sc_length,interval_id; // For rea_create_table
589
uint32_t offset,pack_flag;
591
/* Virtual column expression statement */
592
virtual_column_info *vcol_info;
594
Indication that the field is phycically stored in tables
595
rather than just generated on SQL queries.
596
As of now, FALSE can only be set for generated-only virtual columns.
600
Create_field() :after(0) {}
601
Create_field(Field *field, Field *orig_field);
602
/* Used to make a clone of this object for ALTER/CREATE TABLE */
603
Create_field *clone(MEM_ROOT *mem_root) const
604
{ return new (mem_root) Create_field(*this); }
605
void create_length_to_internal_length(void);
607
inline enum column_format_type column_format() const
776
case DRIZZLE_TYPE_DATE:
777
case DRIZZLE_TYPE_DATETIME:
778
case DRIZZLE_TYPE_MICROTIME:
779
case DRIZZLE_TYPE_TIME:
780
case DRIZZLE_TYPE_TIMESTAMP:
783
case DRIZZLE_TYPE_BLOB:
784
case DRIZZLE_TYPE_BOOLEAN:
785
case DRIZZLE_TYPE_DECIMAL:
786
case DRIZZLE_TYPE_DOUBLE:
787
case DRIZZLE_TYPE_ENUM:
788
case DRIZZLE_TYPE_LONG:
789
case DRIZZLE_TYPE_LONGLONG:
790
case DRIZZLE_TYPE_NULL:
791
case DRIZZLE_TYPE_UUID:
792
case DRIZZLE_TYPE_VARCHAR:
609
return (enum column_format_type)
610
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
802
std::ostream& operator<<(std::ostream& output, const Field &field);
804
} /* namespace drizzled */
806
/** @TODO Why is this in the middle of the file???*/
807
#include <drizzled/create_field.h>
813
* A class for sending field information to a client.
817
* Send_field is basically a stripped-down POD class for
818
* representing basic information about a field...
613
/* Init for a tmp table field. To be extended if need be. */
614
void init_for_tmp_table(enum_field_types sql_type_arg,
615
uint32_t max_length, uint32_t decimals,
616
bool maybe_null, bool is_unsigned);
618
bool init(Session *session, char *field_name, enum_field_types type, char *length,
619
char *decimals, uint32_t type_modifier, Item *default_value,
620
Item *on_update_value, LEX_STRING *comment, char *change,
621
List<String> *interval_list, const CHARSET_INFO * const cs,
622
uint32_t uint_geom_type,
623
enum column_format_type column_format,
624
virtual_column_info *vcol_info);
629
A class for sending info to the client
823
634
const char *db_name;
824
const char *table_name;
825
const char *org_table_name;
826
const char *col_name;
827
const char *org_col_name;
635
const char *table_name,*org_table_name;
636
const char *col_name,*org_col_name;
638
uint32_t charsetnr, flags, decimals;
832
639
enum_field_types type;
645
A class for quick copying data to fields
648
class Copy_field :public Sql_alloc {
650
Convenience definition of a copy function returned by
653
typedef void Copy_func(Copy_field*);
654
Copy_func *get_copy_func(Field *to, Field *from);
656
unsigned char *from_ptr,*to_ptr;
657
unsigned char *from_null_ptr,*to_null_ptr;
659
uint32_t from_bit,to_bit;
660
uint32_t from_length,to_length;
661
Field *from_field,*to_field;
662
String tmp; // For items
666
void set(Field *to,Field *from,bool save); // Field to field
667
void set(unsigned char *to,Field *from); // Field to string
668
void (*do_copy)(Copy_field *);
669
void (*do_copy2)(Copy_field *); // Used to handle null values
673
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
674
unsigned char *null_pos, unsigned char null_bit,
675
uint32_t pack_flag, enum_field_types field_type,
676
const CHARSET_INFO * cs,
677
Field::utype unireg_check,
678
TYPELIB *interval, const char *field_name);
836
680
uint32_t pack_length_to_packflag(uint32_t type);
681
enum_field_types get_blob_type_from_length(uint32_t length);
837
682
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
838
683
int set_field_to_null(Field *field);
839
684
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
842
* Tests if the given string contains important data:
843
* not spaces for character string, or any data for binary string.
845
* @param pointer to the character set to use
846
* @param String to test
850
* false - If string does not have important data
852
* true - If string has some important data
854
bool test_if_important_data(const CHARSET_INFO * const cs,
858
} /* namespace drizzled */
688
test_if_important_data(const CHARSET_INFO * const cs,
860
693
#endif /* DRIZZLED_FIELD_H */