37
36
#include "drizzled/field/decimal.h"
38
37
#include "drizzled/field/real.h"
39
38
#include "drizzled/field/double.h"
40
#include "drizzled/field/int32.h"
41
#include "drizzled/field/int64.h"
39
#include "drizzled/field/long.h"
40
#include "drizzled/field/int64_t.h"
42
41
#include "drizzled/field/num.h"
43
42
#include "drizzled/field/timestamp.h"
44
43
#include "drizzled/field/datetime.h"
45
44
#include "drizzled/field/varstring.h"
46
#include "drizzled/field/uuid.h"
47
45
#include "drizzled/time_functions.h"
48
46
#include "drizzled/internal/m_string.h"
50
#include "drizzled/display.h"
48
using namespace drizzled;
55
50
/*****************************************************************************
56
51
Instansiate templates and static variables
57
52
*****************************************************************************/
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]=
62
57
/* DRIZZLE_TYPE_LONG -> */
429
373
void *Field::operator new(size_t size, memory::Root *mem_root)
431
return mem_root->alloc_root(static_cast<uint32_t>(size));
375
return alloc_root(mem_root, static_cast<uint32_t>(size));
434
378
enum_field_types Field::field_type_merge(enum_field_types a,
435
379
enum_field_types b)
437
assert(a < enum_field_types_size);
438
assert(b < enum_field_types_size);
381
assert(a <= DRIZZLE_TYPE_MAX);
382
assert(b <= DRIZZLE_TYPE_MAX);
439
383
return field_types_merge_rules[a][b];
442
386
Item_result Field::result_merge_type(enum_field_types field_type)
444
assert(field_type < enum_field_types_size);
388
assert(field_type <= DRIZZLE_TYPE_MAX);
445
389
return field_types_result_type[field_type];
638
592
void Field::init(Table *table_arg)
640
594
orig_table= table= table_arg;
595
table_name= &table_arg->alias;
598
String *Field::val_int_as_str(String *val_buffer, bool unsigned_val)
600
const CHARSET_INFO * const cs= &my_charset_bin;
602
int64_t value= val_int();
604
if (val_buffer->alloc(MY_INT64_NUM_DECIMAL_DIGITS))
606
length= (uint32_t) (*cs->cset->int64_t10_to_str)(cs, (char*) val_buffer->ptr(),
607
MY_INT64_NUM_DECIMAL_DIGITS,
608
unsigned_val ? 10 : -10,
610
val_buffer->length(length);
643
614
/// This is used as a table name when the table structure is not set up
697
int Field::store_and_check(enum_check_fields check_level,
700
const CHARSET_INFO * const cs)
669
int Field::compatible_field_size(uint32_t field_metadata)
671
uint32_t const source_size= pack_length_from_metadata(field_metadata);
672
uint32_t const destination_size= row_pack_length();
673
return (source_size <= destination_size);
676
int Field::store(const char *to,
678
const CHARSET_INFO * const cs,
679
enum_check_fields check_level)
704
682
enum_check_fields old_check_level= table->in_use->count_cuted_fields;
771
749
void Field::make_field(SendField *field)
773
if (orig_table && orig_table->getShare()->getSchemaName() && *orig_table->getShare()->getSchemaName())
751
if (orig_table && orig_table->s->db.str && *orig_table->s->db.str)
775
field->db_name= orig_table->getShare()->getSchemaName();
776
field->org_table_name= orig_table->getShare()->getTableName();
753
field->db_name= orig_table->s->db.str;
754
field->org_table_name= orig_table->s->table_name.str;
779
757
field->org_table_name= field->db_name= "";
782
field->table_name= orig_table->getAlias();
760
field->table_name= orig_table->alias;
783
761
field->org_col_name= field_name;
835
813
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
836
if (!(res=val_str_internal(&tmp)) || str_to_datetime_with_warn(res->ptr(), res->length(),
837
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
814
if (!(res=val_str(&tmp)) ||
815
str_to_datetime_with_warn(res->ptr(), res->length(),
816
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
903
876
Field *Field::clone(memory::Root *root, Table *new_table)
906
if ((tmp= (Field*) root->memdup_root((char*) this,size_of())))
879
if ((tmp= (Field*) memdup_root(root,(char*) this,size_of())))
908
881
tmp->init(new_table);
909
tmp->move_field_offset((ptrdiff_t) (new_table->getInsertRecord() -
910
new_table->getDefaultValues()));
882
tmp->move_field_offset((ptrdiff_t) (new_table->record[0] -
883
new_table->s->default_values));
950
923
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:
924
case DRIZZLE_TYPE_DATE: return 3;
925
case DRIZZLE_TYPE_TIMESTAMP:
954
926
case DRIZZLE_TYPE_LONG: return 4;
955
927
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
956
928
case DRIZZLE_TYPE_DATETIME:
957
case DRIZZLE_TYPE_TIMESTAMP:
958
929
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
959
930
case DRIZZLE_TYPE_NULL: return 0;
960
931
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
932
case DRIZZLE_TYPE_ENUM:
961
933
case DRIZZLE_TYPE_DECIMAL:
970
940
uint32_t pack_length_to_packflag(uint32_t type)
973
943
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
974
944
case 2: assert(1);
975
945
case 3: assert(1);
976
case 4: return f_settype(DRIZZLE_TYPE_LONG);
977
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
946
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
947
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
979
949
return 0; // This shouldn't happen
952
Field *make_field(TableShare *share,
955
uint32_t field_length,
957
unsigned char *null_pos,
958
unsigned char null_bit,
960
enum_field_types field_type,
961
const CHARSET_INFO * field_charset,
962
Field::utype unireg_check,
964
const char *field_name)
967
root= current_mem_root();
976
null_bit= ((unsigned char) 1) << null_bit;
981
case DRIZZLE_TYPE_DATE:
982
case DRIZZLE_TYPE_DATETIME:
983
case DRIZZLE_TYPE_TIMESTAMP:
984
field_charset= &my_charset_bin;
988
if (field_type == DRIZZLE_TYPE_VARCHAR ||
989
field_type == DRIZZLE_TYPE_BLOB ||
990
field_type == DRIZZLE_TYPE_ENUM)
992
if (field_type == DRIZZLE_TYPE_VARCHAR)
993
return new (root) Field_varstring(ptr,field_length,
994
HA_VARCHAR_PACKLENGTH(field_length),
1000
if (field_type == DRIZZLE_TYPE_BLOB)
1002
return new (root) Field_blob(ptr,
1007
calc_pack_length(DRIZZLE_TYPE_LONG, 0),
1013
return new (root) Field_enum(ptr,
1018
get_enum_pack_length(interval->count),
1026
case DRIZZLE_TYPE_DECIMAL:
1027
return new (root) Field_decimal(ptr,
1035
false /* is_unsigned */);
1036
case DRIZZLE_TYPE_DOUBLE:
1037
return new (root) Field_double(ptr,
1045
false /* is_unsigned */);
1046
case DRIZZLE_TYPE_LONG:
1047
return new (root) Field_long(ptr,
1054
false /* is_unsigned */);
1055
case DRIZZLE_TYPE_LONGLONG:
1056
return new (root) Field_int64_t(ptr,
1063
false /* is_unsigned */);
1064
case DRIZZLE_TYPE_TIMESTAMP:
1065
return new (root) Field_timestamp(ptr,
1073
case DRIZZLE_TYPE_DATE:
1074
return new (root) Field_date(ptr,
1079
case DRIZZLE_TYPE_DATETIME:
1080
return new (root) Field_datetime(ptr,
1085
case DRIZZLE_TYPE_NULL:
1086
return new (root) Field_null(ptr,
1090
default: // Impossible (Wrong version)
982
1096
/*****************************************************************************
983
1097
Warning handling
984
1098
*****************************************************************************/
1029
1143
set_warning(level, code, cuted_increment))
1031
1145
char str_nr[22];
1032
char *str_end= internal::int64_t10_to_str(nr, str_nr, -10);
1146
char *str_end= int64_t10_to_str(nr, str_nr, -10);
1033
1147
make_truncated_value_warning(session, level, str_nr, (uint32_t) (str_end - str_nr),
1034
1148
ts_type, field_name);
1047
1161
/* DBL_DIG is enough to print '-[digits].E+###' */
1048
1162
char str_nr[DBL_DIG + 8];
1049
uint32_t str_len= snprintf(str_nr, sizeof(str_nr), "%g", nr);
1163
uint32_t str_len= sprintf(str_nr, "%g", nr);
1050
1164
make_truncated_value_warning(session, level, str_nr, str_len, ts_type,