37
35
#include "drizzled/field/decimal.h"
38
36
#include "drizzled/field/real.h"
39
37
#include "drizzled/field/double.h"
40
#include "drizzled/field/int32.h"
41
#include "drizzled/field/int64.h"
38
#include "drizzled/field/long.h"
39
#include "drizzled/field/int64_t.h"
42
40
#include "drizzled/field/num.h"
43
41
#include "drizzled/field/timestamp.h"
44
42
#include "drizzled/field/datetime.h"
45
43
#include "drizzled/field/varstring.h"
46
#include "drizzled/field/uuid.h"
47
#include "drizzled/time_functions.h"
48
#include "drizzled/internal/m_string.h"
50
#include "drizzled/display.h"
55
45
/*****************************************************************************
56
46
Instansiate templates and static variables
57
47
*****************************************************************************/
49
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
50
template class List<CreateField>;
51
template class List_iterator<CreateField>;
59
54
static enum_field_types
60
field_types_merge_rules [enum_field_types_size][enum_field_types_size]=
55
field_types_merge_rules [DRIZZLE_TYPE_MAX+1][DRIZZLE_TYPE_MAX+1]=
57
/* DRIZZLE_TYPE_TINY -> */
67
//DRIZZLE_TYPE_TIMESTAMP
69
//DRIZZLE_TYPE_LONGLONG
70
DRIZZLE_TYPE_LONGLONG,
71
//DRIZZLE_TYPE_DATETIME
75
//DRIZZLE_TYPE_VARCHAR
77
//DRIZZLE_TYPE_NEWDECIMAL
78
DRIZZLE_TYPE_NEWDECIMAL,
62
84
/* DRIZZLE_TYPE_LONG -> */
64
88
//DRIZZLE_TYPE_LONG
66
90
//DRIZZLE_TYPE_DOUBLE
421
416
return (str < strend);
424
void *Field::operator new(size_t size)
426
return memory::sql_alloc(size);
429
void *Field::operator new(size_t size, memory::Root *mem_root)
431
return mem_root->alloc_root(static_cast<uint32_t>(size));
434
419
enum_field_types Field::field_type_merge(enum_field_types a,
435
420
enum_field_types b)
437
assert(a < enum_field_types_size);
438
assert(b < enum_field_types_size);
422
assert(a <= DRIZZLE_TYPE_MAX);
423
assert(b <= DRIZZLE_TYPE_MAX);
439
424
return field_types_merge_rules[a][b];
442
427
Item_result Field::result_merge_type(enum_field_types field_type)
444
assert(field_type < enum_field_types_size);
429
assert(field_type <= DRIZZLE_TYPE_MAX);
445
430
return field_types_result_type[field_type];
862
897
return store(buff, length, &my_charset_bin);
865
bool Field::optimize_range(uint32_t idx, uint32_t)
900
bool Field::optimize_range(uint32_t idx, uint32_t part)
867
return test(table->index_flags(idx) & HA_READ_RANGE);
902
return test(table->file->index_flags(idx, part, 1) & HA_READ_RANGE);
870
Field *Field::new_field(memory::Root *root, Table *new_table, bool)
905
Field *Field::new_field(MEM_ROOT *root, Table *new_table, bool)
873
if (!(tmp= (Field*) root->memdup_root((char*) this,size_of())))
908
if (!(tmp= (Field*) memdup_root(root,(char*) this,size_of())))
876
911
if (tmp->table->maybe_null)
983
Make a field from the .frm file info
947
985
uint32_t calc_pack_length(enum_field_types type,uint32_t length)
950
988
case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
951
case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
952
case DRIZZLE_TYPE_DATE:
953
case DRIZZLE_TYPE_ENUM:
989
case DRIZZLE_TYPE_TINY: return 1;
990
case DRIZZLE_TYPE_DATE: return 3;
991
case DRIZZLE_TYPE_TIMESTAMP:
954
992
case DRIZZLE_TYPE_LONG: return 4;
955
993
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
956
994
case DRIZZLE_TYPE_DATETIME:
957
case DRIZZLE_TYPE_TIMESTAMP:
958
995
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
959
996
case DRIZZLE_TYPE_NULL: return 0;
960
997
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
961
case DRIZZLE_TYPE_DECIMAL:
998
case DRIZZLE_TYPE_ENUM:
999
case DRIZZLE_TYPE_NEWDECIMAL:
970
1006
uint32_t pack_length_to_packflag(uint32_t type)
973
1009
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
974
1010
case 2: assert(1);
975
1011
case 3: assert(1);
976
case 4: return f_settype(DRIZZLE_TYPE_LONG);
977
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
1012
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
1013
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
979
1015
return 0; // This shouldn't happen
1018
Field *make_field(TableShare *share,
1021
uint32_t field_length,
1022
unsigned char *null_pos,
1023
unsigned char null_bit,
1025
enum_field_types field_type,
1026
const CHARSET_INFO * field_charset,
1027
Field::utype unireg_check,
1029
const char *field_name)
1032
root= current_mem_root();
1034
if (!f_maybe_null(pack_flag))
1041
null_bit= ((unsigned char) 1) << null_bit;
1044
switch (field_type) {
1045
case DRIZZLE_TYPE_DATE:
1046
case DRIZZLE_TYPE_DATETIME:
1047
case DRIZZLE_TYPE_TIMESTAMP:
1048
field_charset= &my_charset_bin;
1052
if (f_is_alpha(pack_flag))
1054
if (!f_is_packed(pack_flag))
1056
if (field_type == DRIZZLE_TYPE_VARCHAR)
1057
return new (root) Field_varstring(ptr,field_length,
1058
HA_VARCHAR_PACKLENGTH(field_length),
1060
unireg_check, field_name,
1066
uint32_t pack_length=calc_pack_length((enum_field_types)
1067
f_packtype(pack_flag),
1070
if (f_is_blob(pack_flag))
1071
return new (root) Field_blob(ptr,null_pos,null_bit,
1072
unireg_check, field_name, share,
1073
pack_length, field_charset);
1076
if (f_is_enum(pack_flag))
1078
return new (root) Field_enum(ptr,field_length,null_pos,null_bit,
1079
unireg_check, field_name,
1080
get_enum_pack_length(interval->count),
1081
interval, field_charset);
1086
switch (field_type) {
1087
case DRIZZLE_TYPE_NEWDECIMAL:
1088
return new (root) Field_new_decimal(ptr,field_length,null_pos,null_bit,
1089
unireg_check, field_name,
1090
f_decimals(pack_flag),
1091
f_is_decimal_precision(pack_flag) != 0,
1092
f_is_dec(pack_flag) == 0);
1093
case DRIZZLE_TYPE_DOUBLE:
1094
return new (root) Field_double(ptr,field_length,null_pos,null_bit,
1095
unireg_check, field_name,
1096
f_decimals(pack_flag),
1098
f_is_dec(pack_flag)== 0);
1099
case DRIZZLE_TYPE_TINY:
1101
case DRIZZLE_TYPE_LONG:
1102
return new (root) Field_long(ptr,field_length,null_pos,null_bit,
1103
unireg_check, field_name,
1105
f_is_dec(pack_flag) == 0);
1106
case DRIZZLE_TYPE_LONGLONG:
1107
return new (root) Field_int64_t(ptr,field_length,null_pos,null_bit,
1108
unireg_check, field_name,
1110
f_is_dec(pack_flag) == 0);
1111
case DRIZZLE_TYPE_TIMESTAMP:
1112
return new (root) Field_timestamp(ptr,field_length, null_pos, null_bit,
1113
unireg_check, field_name, share,
1115
case DRIZZLE_TYPE_DATE:
1116
return new (root) Field_date(ptr,null_pos,null_bit,
1117
unireg_check, field_name, field_charset);
1118
case DRIZZLE_TYPE_DATETIME:
1119
return new (root) Field_datetime(ptr,null_pos,null_bit,
1120
unireg_check, field_name, field_charset);
1121
case DRIZZLE_TYPE_NULL:
1122
return new (root) Field_null(ptr, field_length, unireg_check, field_name,
1124
default: // Impossible (Wrong version)
982
1130
/*****************************************************************************
983
1131
Warning handling
984
1132
*****************************************************************************/