31
32
#include "drizzled/field/str.h"
32
33
#include "drizzled/field/num.h"
33
34
#include "drizzled/field/blob.h"
35
#include "drizzled/field/boolean.h"
34
36
#include "drizzled/field/enum.h"
35
37
#include "drizzled/field/null.h"
36
38
#include "drizzled/field/date.h"
37
39
#include "drizzled/field/decimal.h"
38
40
#include "drizzled/field/real.h"
39
41
#include "drizzled/field/double.h"
40
#include "drizzled/field/long.h"
41
#include "drizzled/field/int64_t.h"
42
#include "drizzled/field/int32.h"
43
#include "drizzled/field/int64.h"
42
44
#include "drizzled/field/num.h"
43
#include "drizzled/field/timestamp.h"
45
#include "drizzled/field/time.h"
46
#include "drizzled/field/epoch.h"
44
47
#include "drizzled/field/datetime.h"
48
#include "drizzled/field/microtime.h"
45
49
#include "drizzled/field/varstring.h"
50
#include "drizzled/field/uuid.h"
46
51
#include "drizzled/time_functions.h"
47
52
#include "drizzled/internal/m_string.h"
54
#include "drizzled/display.h"
329
416
DRIZZLE_TYPE_BLOB,
330
417
//DRIZZLE_TYPE_BLOB
331
418
DRIZZLE_TYPE_BLOB,
421
//DRIZZLE_TYPE_BOOLEAN
422
DRIZZLE_TYPE_VARCHAR,
424
DRIZZLE_TYPE_VARCHAR,
425
//DRIZZLE_TYPE_MICROTIME
426
DRIZZLE_TYPE_VARCHAR,
428
/* DRIZZLE_TYPE_TIME -> */
431
DRIZZLE_TYPE_VARCHAR,
432
//DRIZZLE_TYPE_DOUBLE
433
DRIZZLE_TYPE_VARCHAR,
436
//DRIZZLE_TYPE_TIMESTAMP
437
DRIZZLE_TYPE_VARCHAR,
438
//DRIZZLE_TYPE_LONGLONG
439
DRIZZLE_TYPE_VARCHAR,
440
//DRIZZLE_TYPE_DATETIME
441
DRIZZLE_TYPE_VARCHAR,
443
DRIZZLE_TYPE_VARCHAR,
444
//DRIZZLE_TYPE_VARCHAR
445
DRIZZLE_TYPE_VARCHAR,
446
//DRIZZLE_TYPE_DECIMAL
447
DRIZZLE_TYPE_VARCHAR,
448
//DRIZZLE_TYPE_VARCHAR,
449
DRIZZLE_TYPE_VARCHAR,
454
//DRIZZLE_TYPE_BOOLEAN
455
DRIZZLE_TYPE_VARCHAR,
458
//DRIZZLE_TYPE_MICROTIME
459
DRIZZLE_TYPE_VARCHAR,
461
/* DRIZZLE_TYPE_BOOLEAN -> */
464
DRIZZLE_TYPE_VARCHAR,
465
//DRIZZLE_TYPE_DOUBLE
466
DRIZZLE_TYPE_VARCHAR,
468
DRIZZLE_TYPE_BOOLEAN,
469
//DRIZZLE_TYPE_TIMESTAMP
470
DRIZZLE_TYPE_VARCHAR,
471
//DRIZZLE_TYPE_LONGLONG
472
DRIZZLE_TYPE_VARCHAR,
473
//DRIZZLE_TYPE_DATETIME
474
DRIZZLE_TYPE_VARCHAR,
476
DRIZZLE_TYPE_VARCHAR,
477
//DRIZZLE_TYPE_VARCHAR
478
DRIZZLE_TYPE_VARCHAR,
479
//DRIZZLE_TYPE_DECIMAL
480
DRIZZLE_TYPE_VARCHAR,
481
//DRIZZLE_TYPE_VARCHAR,
482
DRIZZLE_TYPE_VARCHAR,
487
//DRIZZLE_TYPE_BOOLEAN
488
DRIZZLE_TYPE_BOOLEAN,
490
DRIZZLE_TYPE_VARCHAR,
491
//DRIZZLE_TYPE_MICROTIME
492
DRIZZLE_TYPE_VARCHAR,
494
/* DRIZZLE_TYPE_UUID -> */
497
DRIZZLE_TYPE_VARCHAR,
498
//DRIZZLE_TYPE_DOUBLE
499
DRIZZLE_TYPE_VARCHAR,
502
//DRIZZLE_TYPE_TIMESTAMP
503
DRIZZLE_TYPE_VARCHAR,
504
//DRIZZLE_TYPE_LONGLONG
505
DRIZZLE_TYPE_VARCHAR,
506
//DRIZZLE_TYPE_DATETIME
507
DRIZZLE_TYPE_VARCHAR,
509
DRIZZLE_TYPE_VARCHAR,
510
//DRIZZLE_TYPE_VARCHAR
511
DRIZZLE_TYPE_VARCHAR,
512
//DRIZZLE_TYPE_DECIMAL
513
DRIZZLE_TYPE_VARCHAR,
514
//DRIZZLE_TYPE_VARCHAR,
515
DRIZZLE_TYPE_VARCHAR,
520
//DRIZZLE_TYPE_BOOLEAN
521
DRIZZLE_TYPE_VARCHAR,
524
//DRIZZLE_TYPE_MICROTIME
525
DRIZZLE_TYPE_VARCHAR,
527
/* DRIZZLE_TYPE_MICROTIME -> */
530
DRIZZLE_TYPE_VARCHAR,
531
//DRIZZLE_TYPE_DOUBLE
532
DRIZZLE_TYPE_VARCHAR,
534
DRIZZLE_TYPE_MICROTIME,
535
//DRIZZLE_TYPE_TIMESTAMP
536
DRIZZLE_TYPE_VARCHAR,
537
//DRIZZLE_TYPE_LONGLONG
538
DRIZZLE_TYPE_VARCHAR,
539
//DRIZZLE_TYPE_DATETIME
540
DRIZZLE_TYPE_VARCHAR,
542
DRIZZLE_TYPE_VARCHAR,
543
//DRIZZLE_TYPE_VARCHAR
544
DRIZZLE_TYPE_VARCHAR,
545
//DRIZZLE_TYPE_DECIMAL
546
DRIZZLE_TYPE_VARCHAR,
547
//DRIZZLE_TYPE_VARCHAR,
548
DRIZZLE_TYPE_VARCHAR,
553
//DRIZZLE_TYPE_BOOLEAN
554
DRIZZLE_TYPE_VARCHAR,
557
//DRIZZLE_TYPE_MICROTIME
558
DRIZZLE_TYPE_MICROTIME,
335
static Item_result field_types_result_type [DRIZZLE_TYPE_MAX+1]=
562
static Item_result field_types_result_type [enum_field_types_size]=
337
564
//DRIZZLE_TYPE_LONG
380
615
enum_field_types Field::field_type_merge(enum_field_types a,
381
616
enum_field_types b)
383
assert(a <= DRIZZLE_TYPE_MAX);
384
assert(b <= DRIZZLE_TYPE_MAX);
618
assert(a < enum_field_types_size);
619
assert(b < enum_field_types_size);
385
620
return field_types_merge_rules[a][b];
388
623
Item_result Field::result_merge_type(enum_field_types field_type)
390
assert(field_type <= DRIZZLE_TYPE_MAX);
625
assert(field_type < enum_field_types_size);
391
626
return field_types_result_type[field_type];
592
827
unsigned char *null_ptr_arg,
593
828
unsigned char null_bit_arg,
594
829
utype unireg_check_arg,
595
const char *field_name_arg)
830
const char *field_name_arg) :
598
832
null_ptr(null_ptr_arg),
600
834
orig_table(NULL),
601
835
field_name(field_name_arg),
836
comment(NULL_LEX_STRING),
604
839
part_of_key_not_clustered(0),
605
840
part_of_sortkey(0),
606
841
unireg_check(unireg_check_arg),
607
842
field_length(length_arg),
843
flags(null_ptr ? 0: NOT_NULL_FLAG),
608
845
null_bit(null_bit_arg),
609
846
is_created_from_null_item(false)
611
flags= null_ptr ? 0: NOT_NULL_FLAG;
612
comment.str= (char*) "";
617
850
void Field::hash(uint32_t *nr, uint32_t *nr2)
643
int Field::store(const char *to,
645
const CHARSET_INFO * const cs,
646
enum_check_fields check_level)
876
int Field::store_and_check(enum_check_fields check_level,
879
const CHARSET_INFO * const cs)
649
883
enum_check_fields old_check_level= table->in_use->count_cuted_fields;
740
974
field->decimals= 0;
743
int64_t Field::convert_decimal2int64_t(const my_decimal *val, bool, int *err)
977
int64_t Field::convert_decimal2int64_t(const type::Decimal *val, bool, int *err)
746
if (warn_if_overflow(my_decimal2int(E_DEC_ERROR &
980
if (warn_if_overflow(val->val_int32(E_DEC_ERROR &
747
981
~E_DEC_OVERFLOW & ~E_DEC_TRUNCATED,
750
984
i= (val->sign() ? INT64_MIN : INT64_MAX);
774
1008
return copy->length+ store_length;
777
bool Field::get_date(DRIZZLE_TIME *ltime,uint32_t fuzzydate)
780
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
781
if (!(res=val_str(&tmp)) ||
782
str_to_datetime_with_warn(res->ptr(), res->length(),
783
ltime, fuzzydate) <= DRIZZLE_TIMESTAMP_ERROR)
788
bool Field::get_time(DRIZZLE_TIME *ltime)
791
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
792
if (!(res=val_str(&tmp)) ||
793
str_to_time_with_warn(res->ptr(), res->length(), ltime))
798
int Field::store_time(DRIZZLE_TIME *ltime, enum enum_drizzle_timestamp_type)
800
char buff[MAX_DATE_STRING_REP_LENGTH];
801
uint32_t length= (uint32_t) my_TIME_to_str(ltime, buff);
802
return store(buff, length, &my_charset_bin);
1011
bool Field::get_date(type::Time <ime, uint32_t fuzzydate)
1013
char buff[type::Time::MAX_STRING_LENGTH];
1014
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1016
assert(getTable() and getTable()->getSession());
1018
if (not (res=val_str_internal(&tmp)) or
1019
str_to_datetime_with_warn(getTable()->getSession(),
1020
res->ptr(), res->length(),
1021
<ime, fuzzydate) <= type::DRIZZLE_TIMESTAMP_ERROR)
1029
bool Field::get_time(type::Time <ime)
1031
char buff[type::Time::MAX_STRING_LENGTH];
1032
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1034
if (not (res= val_str_internal(&tmp)) or
1035
str_to_time_with_warn(getTable()->getSession(), res->ptr(), res->length(), <ime))
1043
int Field::store_time(type::Time <ime, type::timestamp_t)
1049
return store(tmp.ptr(), tmp.length(), &my_charset_bin);
805
1052
bool Field::optimize_range(uint32_t idx, uint32_t)
871
1118
if (!Field::eq_def(field))
873
1121
TYPELIB *from_lib=((Field_enum*) field)->typelib;
875
1123
if (typelib->count < from_lib->count)
877
1126
for (uint32_t i=0 ; i < from_lib->count ; i++)
878
1128
if (my_strnncoll(field_charset,
879
1129
(const unsigned char*)typelib->type_names[i],
880
1130
strlen(typelib->type_names[i]),
881
1131
(const unsigned char*)from_lib->type_names[i],
882
1132
strlen(from_lib->type_names[i])))
890
1142
case DRIZZLE_TYPE_VARCHAR: return (length + (length < 256 ? 1: 2));
1143
case DRIZZLE_TYPE_UUID: return field::Uuid::max_string_length();
1144
case DRIZZLE_TYPE_MICROTIME: return field::Microtime::max_string_length();
1145
case DRIZZLE_TYPE_TIMESTAMP: return field::Epoch::max_string_length();
1146
case DRIZZLE_TYPE_BOOLEAN: return field::Boolean::max_string_length();
891
1147
case DRIZZLE_TYPE_DATE:
892
1148
case DRIZZLE_TYPE_ENUM:
893
1149
case DRIZZLE_TYPE_LONG: return 4;
894
1150
case DRIZZLE_TYPE_DOUBLE: return sizeof(double);
1151
case DRIZZLE_TYPE_TIME:
895
1152
case DRIZZLE_TYPE_DATETIME:
896
case DRIZZLE_TYPE_TIMESTAMP:
897
1153
case DRIZZLE_TYPE_LONGLONG: return 8; /* Don't crash if no int64_t */
898
1154
case DRIZZLE_TYPE_NULL: return 0;
899
1155
case DRIZZLE_TYPE_BLOB: return 4 + portable_sizeof_char_ptr;
900
1156
case DRIZZLE_TYPE_DECIMAL:
907
1164
uint32_t pack_length_to_packflag(uint32_t type)
943
1200
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level,
1201
drizzled::error_t code,
945
1202
const char *str,
946
1203
uint32_t str_length,
947
enum enum_drizzle_timestamp_type ts_type,
1204
type::timestamp_t ts_type,
948
1205
int cuted_increment)
950
Session *session= table ? table->in_use : current_session;
951
if ((session->really_abort_on_warning() &&
1207
Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1209
if ((session->abortOnWarning() and
952
1210
level >= DRIZZLE_ERROR::WARN_LEVEL_WARN) ||
953
1211
set_warning(level, code, cuted_increment))
954
1212
make_truncated_value_warning(session, level, str, str_length, ts_type,
958
1216
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level,
1217
drizzled::error_t code,
961
enum enum_drizzle_timestamp_type ts_type,
1219
type::timestamp_t ts_type,
962
1220
int cuted_increment)
964
Session *session= table ? table->in_use : current_session;
965
if (session->really_abort_on_warning() ||
1222
Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1224
if (session->abortOnWarning() or
966
1225
set_warning(level, code, cuted_increment))
1227
char str_nr[DECIMAL_LONGLONG_DIGITS];
969
1228
char *str_end= internal::int64_t10_to_str(nr, str_nr, -10);
970
1229
make_truncated_value_warning(session, level, str_nr, (uint32_t) (str_end - str_nr),
971
1230
ts_type, field_name);
975
1234
void Field::set_datetime_warning(DRIZZLE_ERROR::enum_warning_level level,
1235
const drizzled::error_t code,
978
enum enum_drizzle_timestamp_type ts_type)
1237
type::timestamp_t ts_type)
980
Session *session= table ? table->in_use : current_session;
981
if (session->really_abort_on_warning() ||
1239
Session *session= (getTable() and getTable()->getSession()) ? getTable()->getSession() : current_session;
1241
if (session->abortOnWarning() or
982
1242
set_warning(level, code, 1))
984
1244
/* DBL_DIG is enough to print '-[digits].E+###' */
1015
1275
table->clearWriteSet(field_index);
1278
void Field::pack_num(uint64_t arg, unsigned char *destination)
1280
if (not destination)
1283
int64_tstore(destination, arg);
1286
void Field::pack_num(uint32_t arg, unsigned char *destination)
1288
if (not destination)
1291
longstore(destination, arg);
1294
uint64_t Field::unpack_num(uint64_t &destination, const unsigned char *arg) const
1299
int64_tget(destination, arg);
1304
uint32_t Field::unpack_num(uint32_t &destination, const unsigned char *arg) const
1309
longget(destination, arg);
1314
std::ostream& operator<<(std::ostream& output, const Field &field)
1316
output << "Field:(";
1317
output << field.field_name;
1319
output << drizzled::display::type(field.real_type());
1322
if (field.flags & NOT_NULL_FLAG)
1323
output << " NOT_NULL";
1325
if (field.flags & PRI_KEY_FLAG)
1326
output << ", PRIMARY KEY";
1328
if (field.flags & UNIQUE_KEY_FLAG)
1329
output << ", UNIQUE KEY";
1331
if (field.flags & MULTIPLE_KEY_FLAG)
1332
output << ", MULTIPLE KEY";
1334
if (field.flags & BLOB_FLAG)
1337
if (field.flags & UNSIGNED_FLAG)
1338
output << ", UNSIGNED";
1340
if (field.flags & BINARY_FLAG)
1341
output << ", BINARY";
1345
return output; // for multiple << operators.
1018
1348
} /* namespace drizzled */