25
25
#ifndef DRIZZLED_FIELD_H
26
26
#define DRIZZLED_FIELD_H
28
#include "drizzled/sql_error.h"
29
#include "drizzled/decimal.h"
30
#include "drizzled/key_map.h"
31
#include "drizzled/sql_list.h"
32
#include "drizzled/structs.h"
33
#include "drizzled/charset_info.h"
34
#include "drizzled/item_result.h"
28
#include <drizzled/sql_error.h>
29
#include <drizzled/my_decimal.h>
30
#include <drizzled/sql_bitmap.h>
31
#include <drizzled/sql_list.h>
32
#include <drizzled/lex_string.h>
42
34
#define DATETIME_DEC 6
43
35
#define DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE FLOATING_POINT_BUFFER
46
#define ASSERT_COLUMN_MARKED_FOR_READ assert(!getTable() || (getTable()->read_set == NULL || isReadSet()))
47
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(!getTable() || (getTable()->write_set == NULL || isWriteSet()))
49
#define ASSERT_COLUMN_MARKED_FOR_READ assert(getTable())
50
#define ASSERT_COLUMN_MARKED_FOR_WRITE assert(getTable())
53
typedef struct st_typelib TYPELIB;
55
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;
63
48
int field_conv(Field *to,Field *from);
66
* Class representing a Field in a Table
70
* The value stored in the Field object is stored in the
71
* unsigned char pointer member variable called ptr. The
72
* val_xxx() methods retrieve this raw byte value and
73
* convert the byte into the appropriate output (int, decimal, etc).
75
* The store_xxx() methods take various input and convert
76
* the input into the raw bytes stored in the ptr member variable.
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;
80
/* Prevent use of these */
63
Field(const Item &); /* Prevent use of these */
82
64
void operator=(Field &);
85
unsigned char *ptr; /**< Position to field in record. Stores raw field value */
86
unsigned char *null_ptr; /**< Byte where null_bit is */
89
* Pointer to the Table object containing this Field
91
* @note You can use table->in_use as replacement for current_session member
92
* only inside of val_*() and store() members (e.g. you can't use it in cons)
103
Table *getTable() const
109
void setTable(Table *table_arg)
114
Table *orig_table; /**< Pointer to the original Table. @TODO What is "the original table"? */
115
const char *field_name; /**< Name of the field */
116
LEX_STRING comment; /**< A comment about the field */
118
/** The field is part of the following keys */
121
key_map part_of_key_not_clustered;
122
key_map part_of_sortkey;
125
We use three additional unireg types for TIMESTAMP for hysterical
126
raisins and limitations in the MySQL FRM file format.
128
A good TODO is to clean this up as we can support just about
129
anything in the table proto message now.
142
uint32_t field_length; /**< Length of this field in bytes */
145
uint16_t field_index; /**< Index of this Field in Table::fields array */
149
uint16_t position() const
154
void setPosition(uint32_t arg)
159
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
161
103
If true, this field was created in create_tmp_field_from_item from a NULL
162
104
value. This means that the type of the field is just a guess, and the type
165
107
@see create_tmp_field_from_item
166
108
@see Item_type_holder::get_real_type
168
111
bool is_created_from_null_item;
170
static void *operator new(size_t size);
171
static void *operator new(size_t size, memory::Root *mem_root);
172
static void operator delete(void *, size_t)
174
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.
177
Field(unsigned char *ptr_arg,
179
unsigned char *null_ptr_arg,
180
unsigned char null_bit_arg,
181
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,
182
124
const char *field_name_arg);
183
125
virtual ~Field() {}
185
bool hasDefault() const
187
return not (flags & NO_DEFAULT_VALUE_FLAG);
190
126
/* Store functions returns 1 on overflow and -1 on fatal error */
191
virtual int store(const char *to,
193
const CHARSET_INFO * const cs)=0;
194
virtual int store(double nr)=0;
195
virtual int store(int64_t nr, bool unsigned_val)=0;
196
virtual int store_decimal(const my_decimal *d)=0;
197
int store_and_check(enum_check_fields check_level,
200
const CHARSET_INFO * const cs);
202
This is called when storing a date in a string.
205
Needs to be changed if/when we want to support different time formats.
207
virtual int store_time(DRIZZLE_TIME *ltime, enum enum_drizzle_timestamp_type t_type);
208
virtual double val_real()=0;
209
virtual int64_t val_int()=0;
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;
210
138
virtual my_decimal *val_decimal(my_decimal *);
211
String *val_str_internal(String *str)
213
return val_str(str, str);
139
inline String *val_str(String *str) { return val_str(str, str); }
216
141
val_str(buf1, buf2) gets two buffers and should use them as follows:
217
142
if it needs a temp buffer to convert result to string - use buf1
269
186
static Item_result result_merge_type(enum_field_types);
271
188
virtual bool eq(Field *field);
273
* Returns true if the fields are equally defined
276
* true This Field is equally defined to supplied Field
278
* false This Field is NOT equally defined to supplied Field
280
189
virtual bool eq_def(Field *field);
283
* Returns size (in bytes) used to store field data in memory
284
* (i.e. it returns the maximum size of the field in a row of the table,
285
* 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).
287
196
virtual uint32_t pack_length() const;
290
* Returns size (in bytes) used to store field data on
291
* storage (i.e. it returns the maximal size of the field in a row of the
292
* 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).
294
203
virtual uint32_t pack_length_in_rec() const;
297
* Return the "real size" of the data in memory.
298
* 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.
300
226
virtual uint32_t data_length();
302
* Returns the number of bytes actually used to store the data
303
* of the field. So for a varstring it includes both lenght byte(s) and
304
* 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.
306
232
virtual uint32_t used_length();
307
233
virtual uint32_t sort_length() const;
344
271
virtual uint32_t size_of() const =0;
346
bool is_null(ptrdiff_t row_offset= 0);
347
bool is_real_null(ptrdiff_t row_offset= 0);
273
bool is_null(my_ptrdiff_t row_offset= 0);
274
bool is_real_null(my_ptrdiff_t row_offset= 0);
348
275
bool is_null_in_record(const unsigned char *record);
349
bool is_null_in_record_with_offset(ptrdiff_t offset);
350
void set_null(ptrdiff_t row_offset= 0);
351
void set_notnull(ptrdiff_t row_offset= 0);
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);
352
279
bool maybe_null(void);
353
280
bool real_maybe_null(void);
355
virtual void make_field(SendField *);
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 *);
356
304
virtual void sort_string(unsigned char *buff,uint32_t length)=0;
357
305
virtual bool optimize_range(uint32_t idx, uint32_t part);
359
* Returns true for fields which, when compared with constant
360
* items, can be casted to int64_t. In this case we will at 'fix_fields'
361
* stage cast the constant items to int64_ts and at the execution stage
362
* use field->val_int() for comparison. Used to optimize clauses like
363
* 'a_column BETWEEN date_const AND date_const'.
365
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; }
369
314
virtual void free() {}
370
virtual Field *new_field(memory::Root *root,
315
virtual Field *new_field(MEM_ROOT *root, Table *new_table,
373
virtual Field *new_key_field(memory::Root *root, Table *new_table,
374
unsigned char *new_ptr,
375
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,
376
319
uint32_t new_null_bit);
377
/** This is used to generate a field in Table from TableShare */
378
Field *clone(memory::Root *mem_root, Table *new_table);
379
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)
382
null_ptr= null_ptr_arg;
383
null_bit= null_bit_arg;
323
ptr=ptr_arg; null_ptr=null_ptr_arg; null_bit=null_bit_arg;
385
void move_field(unsigned char *ptr_arg) { ptr=ptr_arg; }
386
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)
388
ptr= ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
328
ptr=ADD_TO_PTR(ptr,ptr_diff, unsigned char*);
390
null_ptr= ADD_TO_PTR(null_ptr,ptr_diff,unsigned char*);
392
virtual void get_image(unsigned char *buff, uint32_t length, const CHARSET_INFO * const)
394
memcpy(buff,ptr,length);
396
virtual void get_image(std::basic_string<unsigned char> &buff, uint32_t length, const CHARSET_INFO * const)
398
buff.append(ptr,length);
400
virtual void set_image(const unsigned char *buff,uint32_t length, const CHARSET_INFO * const)
402
memcpy(ptr,buff,length);
406
* Copy a field part into an output buffer.
410
* This function makes a copy of field part of size equal to or
411
* less than "length" parameter value.
412
* For fields of string types (VARCHAR, TEXT) the rest of buffer
413
* is padded by zero byte.
415
* @param output buffer
416
* @param output buffer size
420
* For variable length character fields (i.e. UTF-8) the "length"
421
* parameter means a number of output buffer bytes as if all field
422
* characters have maximal possible size (mbmaxlen). In the other words,
423
* "length" parameter is a number of characters multiplied by
424
* field_charset->mbmaxlen.
427
* Number of copied bytes (excluding padded zero bytes -- see above).
429
virtual uint32_t get_key_image(unsigned char *buff, uint32_t length)
431
get_image(buff, length, &my_charset_bin);
434
virtual uint32_t get_key_image(std::basic_string<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 set_image(const unsigned char *buff,uint32_t length,
336
const CHARSET_INFO * const)
337
{ memcpy(ptr,buff,length); }
341
Copy a field part into an output buffer.
344
Field::get_key_image()
345
buff [out] output buffer
346
length output buffer size
347
type itMBR for geometry blobs, otherwise itRAW
350
This function makes a copy of field part of size equal to or
351
less than "length" parameter value.
352
For fields of string types (CHAR, VARCHAR, TEXT) the rest of buffer
353
is padded by zero byte.
356
For variable length character fields (i.e. UTF-8) the "length"
357
parameter means a number of output buffer bytes as if all field
358
characters have maximal possible size (mbmaxlen). In the other words,
359
"length" parameter is a number of characters multiplied by
360
field_charset->mbmaxlen.
363
Number of copied bytes (excluding padded zero bytes -- see above).
366
virtual uint32_t get_key_image(unsigned char *buff, uint32_t length, imagetype)
436
368
get_image(buff, length, &my_charset_bin);
439
371
virtual void set_key_image(const unsigned char *buff,uint32_t length)
441
set_image(buff,length, &my_charset_bin);
443
int64_t val_int_offset(uint32_t row_offset)
446
int64_t tmp=val_int();
451
int64_t val_int_internal(const unsigned char *new_ptr)
372
{ set_image(buff,length, &my_charset_bin); }
373
inline int64_t val_int_offset(uint32_t row_offset)
376
int64_t tmp=val_int();
380
inline int64_t val_int(const unsigned char *new_ptr)
453
382
unsigned char *old_ptr= ptr;
454
383
int64_t return_value;
455
ptr= const_cast<unsigned char*>(new_ptr);
384
ptr= (unsigned char*) new_ptr;
456
385
return_value= val_int();
458
387
return return_value;
461
String *val_str_internal(String *str, const unsigned char *new_ptr)
389
inline String *val_str(String *str, const unsigned char *new_ptr)
463
391
unsigned char *old_ptr= ptr;
464
ptr= const_cast<unsigned char*>(new_ptr);
465
val_str_internal(str);
392
ptr= (unsigned char*) new_ptr;
397
virtual bool send_binary(Protocol *protocol);
399
virtual unsigned char *pack(unsigned char *to, const unsigned char *from,
400
uint32_t max_length, bool low_byte_first);
471
Pack the field into a format suitable for storage and transfer.
473
To implement packing functionality, only the virtual function
474
should be overridden. The other functions are just convenience
475
functions and hence should not be overridden.
477
The value of <code>low_byte_first</code> is dependent on how the
478
packed data is going to be used: for local use, e.g., temporary
479
store on disk or in memory, use the native format since that is
480
faster. For data that is going to be transfered to other machines
481
(e.g., when writing data to the binary log), data should always be
482
stored in little-endian format.
484
@note The default method for packing fields just copy the raw bytes
485
of the record into the destination, but never more than
486
<code>max_length</code> characters.
489
Pointer to memory area where representation of field should be put.
492
Pointer to memory area where record representation of field is
496
Maximum length of the field, as given in the column definition. For
497
example, for <code>CHAR(1000)</code>, the <code>max_length</code>
498
is 1000. This information is sometimes needed to decide how to pack
501
@param low_byte_first
502
@c true if integers should be stored little-endian, @c false if
503
native format should be used. Note that for little-endian machines,
504
the value of this flag is a moot point since the native format is
402
@overload Field::pack(unsigned char*, const unsigned char*,
507
virtual unsigned char *pack(unsigned char *to,
508
const unsigned char *from,
510
bool low_byte_first);
512
405
unsigned char *pack(unsigned char *to, const unsigned char *from);
515
Unpack a field from row data.
517
This method is used to unpack a field from a master whose size of
518
the field is less than that of the slave.
520
The <code>param_data</code> parameter is a two-byte integer (stored
521
in the least significant 16 bits of the unsigned integer) usually
522
consisting of two parts: the real type in the most significant byte
523
and a original pack length in the least significant byte.
525
The exact layout of the <code>param_data</code> field is given by
526
the <code>Table_map_log_event::save_field_metadata()</code>.
528
This is the default method for unpacking a field. It just copies
529
the memory block in byte order (of original pack length bytes or
530
length of field, whichever is smaller).
532
@param to Destination of the data
533
@param from Source of the data
534
@param param_data Real type and original pack length of the field
537
@param low_byte_first
538
If this flag is @c true, all composite entities (e.g., lengths)
539
should be unpacked in little-endian format; otherwise, the entities
540
are unpacked in native order.
542
@return New pointer into memory based on from + length of the data
544
407
virtual const unsigned char *unpack(unsigned char* to,
545
408
const unsigned char *from,
546
409
uint32_t param_data,
567
434
return unpack(to, from, max_length, low_byte_first);
436
virtual uint32_t packed_col_length(const unsigned char *to, uint32_t length);
569
437
virtual uint32_t max_packed_col_length(uint32_t max_length)
574
uint32_t offset(const unsigned char *record)
438
{ return max_length;}
440
virtual int pack_cmp(const unsigned char *a,const unsigned char *b,
441
uint32_t key_length_arg,
442
bool insert_or_update);
443
virtual int pack_cmp(const unsigned char *b,
444
uint32_t key_length_arg,
445
bool insert_or_update);
447
uint32_t offset(unsigned char *record)
576
449
return (uint32_t) (ptr - record);
578
451
void copy_from_tmp(int offset);
579
uint32_t fill_cache_field(CacheField *copy);
452
uint32_t fill_cache_field(struct st_cache_field *copy);
580
453
virtual bool get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate);
581
454
virtual bool get_time(DRIZZLE_TIME *ltime);
582
455
virtual const CHARSET_INFO *charset(void) const { return &my_charset_bin; }
583
456
virtual const CHARSET_INFO *sort_charset(void) const { return charset(); }
584
457
virtual bool has_charset(void) const { return false; }
585
458
virtual void set_charset(const CHARSET_INFO * const)
587
460
virtual enum Derivation derivation(void) const
589
return DERIVATION_IMPLICIT;
461
{ return DERIVATION_IMPLICIT; }
591
462
virtual void set_derivation(enum Derivation)
594
Produce warning or note about data saved into field.
596
@param level - level of message (Note/Warning/Error)
597
@param code - error code of message to be produced
598
@param cuted_increment - whenever we should increase cut fields count or not
601
This function won't produce warning and increase cut fields counter
602
if count_cuted_fields == CHECK_FIELD_IGNORE for current thread.
604
if count_cuted_fields == CHECK_FIELD_IGNORE then we ignore notes.
605
This allows us to avoid notes in optimisation, like convert_constant_item().
608
1 if count_cuted_fields == CHECK_FIELD_IGNORE and error level is not NOTE
612
bool set_warning(DRIZZLE_ERROR::enum_warning_level,
464
bool set_warning(DRIZZLE_ERROR::enum_warning_level, unsigned int code,
614
465
int cuted_increment);
616
Produce warning or note about datetime string data saved into field.
618
@param level level of message (Note/Warning/Error)
619
@param code error code of message to be produced
620
@param str string value which we tried to save
621
@param str_length length of string which we tried to save
622
@param ts_type type of datetime value (datetime/date/time)
623
@param cuted_increment whenever we should increase cut fields count or not
626
This function will always produce some warning but won't increase cut
627
fields counter if count_cuted_fields ==FIELD_CHECK_IGNORE for current
630
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
634
enum enum_drizzle_timestamp_type ts_type,
635
int cuted_increment);
637
Produce warning or note about integer datetime value saved into field.
639
@param level level of message (Note/Warning/Error)
640
@param code error code of message to be produced
641
@param nr numeric value which we tried to save
642
@param ts_type type of datetime value (datetime/date/time)
643
@param cuted_increment whenever we should increase cut fields count or not
646
This function will always produce some warning but won't increase cut
647
fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
650
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
653
enum enum_drizzle_timestamp_type ts_type,
654
int cuted_increment);
656
Produce warning or note about double datetime data 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 double value which we tried to save
661
@param ts_type type of datetime value (datetime/date/time)
664
This function will always produce some warning but won't increase cut
665
fields counter if count_cuted_fields == FIELD_CHECK_IGNORE for current
668
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level,
671
enum enum_drizzle_timestamp_type ts_type);
672
bool check_overflow(int op_result)
466
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code,
467
const char *str, uint32_t str_len,
468
enum enum_drizzle_timestamp_type ts_type, int cuted_increment);
469
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, uint32_t code,
470
int64_t nr, enum enum_drizzle_timestamp_type ts_type,
471
int cuted_increment);
472
void set_datetime_warning(DRIZZLE_ERROR::enum_warning_level, const uint32_t code,
473
double nr, enum enum_drizzle_timestamp_type ts_type);
474
inline bool check_overflow(int op_result)
674
476
return (op_result == E_DEC_OVERFLOW);
677
Process decimal library return codes and issue warnings for overflow and
680
@param op_result decimal library return code (E_DEC_* see include/decimal.h)
683
E_DEC_OVERFLOW there was overflow
684
E_DEC_TRUNCATED there was truncation
686
0 no error or there was some other error except overflow or truncation
688
478
int warn_if_overflow(int op_result);
689
479
void init(Table *table_arg);
691
481
/* maximum possible display length */
692
482
virtual uint32_t max_display_length()= 0;
694
virtual uint32_t is_equal(CreateField *new_field);
696
Conversion from decimal to int64_t with checking overflow and
697
setting correct value (min/max) in case of overflow.
699
@param val value which have to be converted
700
@param unsigned_flag type of integer in which we convert val
701
@param err variable to pass error code
704
value converted from val
706
int64_t convert_decimal2int64_t(const my_decimal *val,
484
virtual uint32_t is_equal(Create_field *new_field);
485
/* convert decimal to int64_t with overflow check */
486
int64_t convert_decimal2int64_t(const my_decimal *val, bool unsigned_flag,
709
488
/* The max. number of characters */
710
uint32_t char_length() const
489
inline uint32_t char_length() const
712
491
return field_length / charset()->mbmaxlen;
715
enum column_format_type column_format() const
494
inline enum column_format_type column_format() const
717
496
return (enum column_format_type)
718
497
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
735
515
friend class Item_sum_max;
736
516
friend class Item_func_group_concat;
740
void setReadSet(bool arg= true);
741
void setWriteSet(bool arg= true);
744
std::ostream& operator<<(std::ostream& output, const Field &field);
746
} /* namespace drizzled */
748
/** @TODO Why is this in the middle of the file???*/
749
#include "drizzled/create_field.h"
520
Primitive for implementing last_null_byte().
526
Primitive for the implementation of the last_null_byte()
527
function. This represents the inheritance interface and can be
528
overridden by subclasses.
530
virtual size_t do_last_null_byte() const;
755
* A class for sending field information to a client.
759
* Send_field is basically a stripped-down POD class for
760
* representing basic information about a field...
533
Retrieve the field metadata for fields.
535
This default implementation returns 0 and saves 0 in the metadata_ptr
538
@param metadata_ptr First byte of field metadata
540
@returns 0 no bytes written.
542
virtual int do_save_field_metadata(unsigned char *)
547
Create field class for CREATE TABLE
550
class Create_field :public Sql_alloc
553
const char *field_name;
554
const char *change; // If done with alter table
555
const char *after; // Put column after this one
556
LEX_STRING comment; // Comment for field
557
Item *def; // Default value
558
enum enum_field_types sql_type;
560
At various stages in execution this can be length of field in bytes or
561
max number of characters.
565
The value of `length' as set by parser: is the number of characters
566
for most of the types, or of bytes for BLOBs or numeric types.
568
uint32_t char_length;
569
uint32_t decimals, flags, pack_length, key_length;
570
Field::utype unireg_check;
571
TYPELIB *interval; // Which interval to use
572
TYPELIB *save_interval; // Temporary copy for the above
573
// Used only for UCS2 intervals
574
List<String> interval_list;
575
const CHARSET_INFO *charset;
576
Field *field; // For alter table
578
uint8_t row,col,sc_length,interval_id; // For rea_create_table
579
uint32_t offset,pack_flag;
581
/* Virtual column expression statement */
582
virtual_column_info *vcol_info;
584
Indication that the field is phycically stored in tables
585
rather than just generated on SQL queries.
586
As of now, FALSE can only be set for generated-only virtual columns.
590
Create_field() :after(0) {}
591
Create_field(Field *field, Field *orig_field);
592
/* Used to make a clone of this object for ALTER/CREATE TABLE */
593
Create_field *clone(MEM_ROOT *mem_root) const
594
{ return new (mem_root) Create_field(*this); }
595
void create_length_to_internal_length(void);
597
inline enum column_format_type column_format() const
599
return (enum column_format_type)
600
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
603
/* Init for a tmp table field. To be extended if need be. */
604
void init_for_tmp_table(enum_field_types sql_type_arg,
605
uint32_t max_length, uint32_t decimals,
606
bool maybe_null, bool is_unsigned);
608
bool init(Session *session, char *field_name, enum_field_types type, char *length,
609
char *decimals, uint32_t type_modifier, Item *default_value,
610
Item *on_update_value, LEX_STRING *comment, char *change,
611
List<String> *interval_list, const CHARSET_INFO * const cs,
612
uint32_t uint_geom_type,
613
enum column_format_type column_format,
614
virtual_column_info *vcol_info);
619
A class for sending info to the client
765
624
const char *db_name;
766
const char *table_name;
767
const char *org_table_name;
768
const char *col_name;
769
const char *org_col_name;
625
const char *table_name,*org_table_name;
626
const char *col_name,*org_col_name;
628
uint32_t charsetnr, flags, decimals;
774
629
enum_field_types type;
779
* A class for quick copying data to fields
781
class CopyField :public memory::SqlAlloc
635
A class for quick copying data to fields
638
class Copy_field :public Sql_alloc {
784
640
Convenience definition of a copy function returned by
787
typedef void Copy_func(CopyField*);
643
typedef void Copy_func(Copy_field*);
788
644
Copy_func *get_copy_func(Field *to, Field *from);
790
unsigned char *from_ptr;
791
unsigned char *to_ptr;
792
unsigned char *from_null_ptr;
793
unsigned char *to_null_ptr;
646
unsigned char *from_ptr,*to_ptr;
647
unsigned char *from_null_ptr,*to_null_ptr;
797
uint32_t from_length;
649
uint32_t from_bit,to_bit;
650
uint32_t from_length,to_length;
651
Field *from_field,*to_field;
801
652
String tmp; // For items
805
void set(Field *to,Field *from,bool save); // Field to field
656
void set(Field *to,Field *from,bool save); // Field to field
806
657
void set(unsigned char *to,Field *from); // Field to string
807
void (*do_copy)(CopyField *);
808
void (*do_copy2)(CopyField *); // Used to handle null values
658
void (*do_copy)(Copy_field *);
659
void (*do_copy2)(Copy_field *); // Used to handle null values
663
Field *make_field(TABLE_SHARE *share, unsigned char *ptr, uint32_t field_length,
664
unsigned char *null_pos, unsigned char null_bit,
665
uint32_t pack_flag, enum_field_types field_type,
666
const CHARSET_INFO * cs,
667
Field::utype unireg_check,
668
TYPELIB *interval, const char *field_name);
811
670
uint32_t pack_length_to_packflag(uint32_t type);
671
enum_field_types get_blob_type_from_length(uint32_t length);
812
672
uint32_t calc_pack_length(enum_field_types type,uint32_t length);
813
673
int set_field_to_null(Field *field);
814
674
int set_field_to_null_with_conversions(Field *field, bool no_conversions);
817
* Tests if the given string contains important data:
818
* not spaces for character string, or any data for binary string.
820
* @param pointer to the character set to use
821
* @param String to test
825
* false - If string does not have important data
827
* true - If string has some important data
829
bool test_if_important_data(const CHARSET_INFO * const cs,
833
} /* namespace drizzled */
678
test_if_important_data(const CHARSET_INFO * const cs,
835
683
#endif /* DRIZZLED_FIELD_H */