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));
921
Make a field from the .frm file info
947
923
uint32_t calc_pack_length(enum_field_types type,uint32_t length)
950
926
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:
927
case DRIZZLE_TYPE_DATE: return 3;
928
case DRIZZLE_TYPE_TIMESTAMP:
954
929
case DRIZZLE_TYPE_LONG: return 4;
955
930
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
956
931
case DRIZZLE_TYPE_DATETIME:
957
case DRIZZLE_TYPE_TIMESTAMP:
958
932
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
959
933
case DRIZZLE_TYPE_NULL: return 0;
960
934
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
935
case DRIZZLE_TYPE_ENUM:
961
936
case DRIZZLE_TYPE_DECIMAL:
970
943
uint32_t pack_length_to_packflag(uint32_t type)
973
946
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
974
947
case 2: assert(1);
975
948
case 3: assert(1);
976
case 4: return f_settype(DRIZZLE_TYPE_LONG);
977
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
949
case 4: return f_settype((uint32_t) DRIZZLE_TYPE_LONG);
950
case 8: return f_settype((uint32_t) DRIZZLE_TYPE_LONGLONG);
979
952
return 0; // This shouldn't happen
955
Field *make_field(TableShare *share,
958
uint32_t field_length,
960
unsigned char *null_pos,
961
unsigned char null_bit,
963
enum_field_types field_type,
964
const CHARSET_INFO * field_charset,
965
Field::utype unireg_check,
967
const char *field_name)
970
root= current_mem_root();
979
null_bit= ((unsigned char) 1) << null_bit;
984
case DRIZZLE_TYPE_DATE:
985
case DRIZZLE_TYPE_DATETIME:
986
case DRIZZLE_TYPE_TIMESTAMP:
987
field_charset= &my_charset_bin;
991
if (field_type == DRIZZLE_TYPE_VARCHAR ||
992
field_type == DRIZZLE_TYPE_BLOB ||
993
field_type == DRIZZLE_TYPE_ENUM)
995
if (field_type == DRIZZLE_TYPE_VARCHAR)
996
return new (root) Field_varstring(ptr,field_length,
997
HA_VARCHAR_PACKLENGTH(field_length),
1003
if (field_type == DRIZZLE_TYPE_BLOB)
1005
return new (root) Field_blob(ptr,
1010
calc_pack_length(DRIZZLE_TYPE_LONG, 0),
1016
return new (root) Field_enum(ptr,
1021
get_enum_pack_length(interval->count),
1029
case DRIZZLE_TYPE_DECIMAL:
1030
return new (root) Field_decimal(ptr,
1038
false /* is_unsigned */);
1039
case DRIZZLE_TYPE_DOUBLE:
1040
return new (root) Field_double(ptr,
1048
false /* is_unsigned */);
1049
case DRIZZLE_TYPE_LONG:
1050
return new (root) Field_long(ptr,
1057
false /* is_unsigned */);
1058
case DRIZZLE_TYPE_LONGLONG:
1059
return new (root) Field_int64_t(ptr,
1066
false /* is_unsigned */);
1067
case DRIZZLE_TYPE_TIMESTAMP:
1068
return new (root) Field_timestamp(ptr,
1076
case DRIZZLE_TYPE_DATE:
1077
return new (root) Field_date(ptr,
1082
case DRIZZLE_TYPE_DATETIME:
1083
return new (root) Field_datetime(ptr,
1088
case DRIZZLE_TYPE_NULL:
1089
return new (root) Field_null(ptr,
1093
default: // Impossible (Wrong version)
982
1099
/*****************************************************************************
983
1100
Warning handling
984
1101
*****************************************************************************/
1029
1146
set_warning(level, code, cuted_increment))
1031
1148
char str_nr[22];
1032
char *str_end= internal::int64_t10_to_str(nr, str_nr, -10);
1149
char *str_end= int64_t10_to_str(nr, str_nr, -10);
1033
1150
make_truncated_value_warning(session, level, str_nr, (uint32_t) (str_end - str_nr),
1034
1151
ts_type, field_name);
1047
1164
/* DBL_DIG is enough to print '-[digits].E+###' */
1048
1165
char str_nr[DBL_DIG + 8];
1049
uint32_t str_len= snprintf(str_nr, sizeof(str_nr), "%g", nr);
1166
uint32_t str_len= sprintf(str_nr, "%g", nr);
1050
1167
make_truncated_value_warning(session, level, str_nr, str_len, ts_type,