23
23
* @file This file implements the Field class and API
30
#include "drizzled/sql_select.h"
31
#include "drizzled/error.h"
32
#include "drizzled/field/str.h"
33
#include "drizzled/field/num.h"
34
#include "drizzled/field/blob.h"
35
#include "drizzled/field/boolean.h"
36
#include "drizzled/field/enum.h"
37
#include "drizzled/field/null.h"
38
#include "drizzled/field/date.h"
39
#include "drizzled/field/decimal.h"
40
#include "drizzled/field/real.h"
41
#include "drizzled/field/double.h"
42
#include "drizzled/field/int32.h"
43
#include "drizzled/field/int64.h"
44
#include "drizzled/field/num.h"
45
#include "drizzled/field/time.h"
46
#include "drizzled/field/epoch.h"
47
#include "drizzled/field/datetime.h"
48
#include "drizzled/field/microtime.h"
49
#include "drizzled/field/varstring.h"
50
#include "drizzled/field/uuid.h"
51
#include "drizzled/time_functions.h"
52
#include "drizzled/internal/m_string.h"
54
#include "drizzled/display.h"
30
#include <drizzled/sql_select.h>
31
#include <drizzled/error.h>
32
#include <drizzled/field/str.h>
33
#include <drizzled/field/num.h>
34
#include <drizzled/field/blob.h>
35
#include <drizzled/field/boolean.h>
36
#include <drizzled/field/enum.h>
37
#include <drizzled/field/null.h>
38
#include <drizzled/field/date.h>
39
#include <drizzled/field/decimal.h>
40
#include <drizzled/field/real.h>
41
#include <drizzled/field/double.h>
42
#include <drizzled/field/int32.h>
43
#include <drizzled/field/int64.h>
44
#include <drizzled/field/num.h>
45
#include <drizzled/field/time.h>
46
#include <drizzled/field/epoch.h>
47
#include <drizzled/field/datetime.h>
48
#include <drizzled/field/microtime.h>
49
#include <drizzled/field/varstring.h>
50
#include <drizzled/field/uuid.h>
51
#include <drizzled/time_functions.h>
52
#include <drizzled/internal/m_string.h>
53
#include <drizzled/table.h>
54
#include <drizzled/util/test.h>
55
#include <drizzled/session.h>
56
#include <drizzled/current_session.h>
57
#include <drizzled/display.h>
58
#include <drizzled/typelib.h>
59
#include <drizzled/create_field.h>
59
63
/*****************************************************************************
60
64
Instansiate templates and static variables
745
bool Field::is_null(ptrdiff_t row_offset)
748
(null_ptr[row_offset] & null_bit ? true : false) :
752
bool Field::is_real_null(ptrdiff_t row_offset)
754
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : false;
757
bool Field::is_null_in_record(const unsigned char *record)
761
return test(record[(uint32_t) (null_ptr -table->getInsertRecord())] & null_bit);
764
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset)
768
return test(null_ptr[with_offset] & null_bit);
749
bool Field::is_null(ptrdiff_t row_offset) const
751
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : table->null_row;
754
bool Field::is_real_null(ptrdiff_t row_offset) const
756
return null_ptr && (null_ptr[row_offset] & null_bit);
759
bool Field::is_null_in_record(const unsigned char *record) const
761
return null_ptr && test(record[(uint32_t) (null_ptr -table->getInsertRecord())] & null_bit);
764
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset) const
766
return null_ptr && test(null_ptr[with_offset] & null_bit);
771
769
void Field::set_null(ptrdiff_t row_offset)
780
778
null_ptr[row_offset]&= (unsigned char) ~null_bit;
783
bool Field::maybe_null(void)
781
bool Field::maybe_null(void) const
785
783
return null_ptr != 0 || table->maybe_null;
788
bool Field::real_maybe_null(void)
786
bool Field::real_maybe_null(void) const
790
788
return null_ptr != 0;
793
791
bool Field::type_can_have_key_part(enum enum_field_types type)
796
795
case DRIZZLE_TYPE_VARCHAR:
797
796
case DRIZZLE_TYPE_BLOB:
876
875
int Field::store_and_check(enum_check_fields check_level,
879
const CHARSET_INFO * const cs)
878
const charset_info_st * const cs)
883
881
enum_check_fields old_check_level= table->in_use->count_cuted_fields;
884
882
table->in_use->count_cuted_fields= check_level;
885
res= store(to, length, cs);
883
int res= store(to, length, cs);
886
884
table->in_use->count_cuted_fields= old_check_level;
898
896
unsigned char *Field::pack(unsigned char *to, const unsigned char *from)
900
unsigned char *result= this->pack(to, from, UINT32_MAX, table->getShare()->db_low_byte_first);
898
return this->pack(to, from, UINT32_MAX, table->getShare()->db_low_byte_first);
904
901
const unsigned char *Field::unpack(unsigned char* to,
936
933
const unsigned char *Field::unpack(unsigned char* to, const unsigned char *from)
938
const unsigned char *result= unpack(to, from, 0U, table->getShare()->db_low_byte_first);
935
return unpack(to, from, 0, table->getShare()->db_low_byte_first);
942
type::Decimal *Field::val_decimal(type::Decimal *)
938
type::Decimal *Field::val_decimal(type::Decimal *) const
944
940
/* This never have to be called */
1008
1004
return copy->length+ store_length;
1011
bool Field::get_date(type::Time <ime, uint32_t fuzzydate)
1007
bool Field::get_date(type::Time <ime, uint32_t fuzzydate) const
1013
1009
char buff[type::Time::MAX_STRING_LENGTH];
1014
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1010
String tmp(buff,sizeof(buff),&my_charset_bin);
1016
1012
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)
1014
String* res= val_str_internal(&tmp);
1015
return not res or str_to_datetime_with_warn(getTable()->getSession(), res->ptr(), res->length(), <ime, fuzzydate) <= type::DRIZZLE_TIMESTAMP_ERROR;
1029
bool Field::get_time(type::Time <ime)
1018
bool Field::get_time(type::Time <ime) const
1031
1020
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))
1021
String tmp(buff,sizeof(buff),&my_charset_bin);
1023
String* res= val_str_internal(&tmp);
1024
return not res or str_to_time_with_warn(getTable()->getSession(), res->ptr(), res->length(), <ime);
1043
1027
int Field::store_time(type::Time <ime, type::timestamp_t)
1047
1030
ltime.convert(tmp);
1049
1031
return store(tmp.ptr(), tmp.length(), &my_charset_bin);
1077
1056
unsigned char *new_null_ptr,
1078
1057
uint32_t new_null_bit)
1081
if ((tmp= new_field(root, new_table, table == new_table)))
1084
tmp->null_ptr= new_null_ptr;
1085
tmp->null_bit= new_null_bit;
1059
Field *tmp= new_field(root, new_table, table == new_table);
1061
tmp->null_ptr= new_null_ptr;
1062
tmp->null_bit= new_null_bit;
1090
1066
Field *Field::clone(memory::Root *root, Table *new_table)
1093
if ((tmp= (Field*) root->memdup_root((char*) this,size_of())))
1095
tmp->init(new_table);
1096
tmp->move_field_offset((ptrdiff_t) (new_table->getInsertRecord() -
1097
new_table->getDefaultValues()));
1068
Field *tmp= (Field*) root->memdup(this,size_of());
1069
tmp->init(new_table);
1070
tmp->move_field_offset((ptrdiff_t) (new_table->getInsertRecord() - new_table->getDefaultValues()));
1103
1074
uint32_t Field::is_equal(CreateField *new_field_ptr)
1105
return (new_field_ptr->sql_type == real_type());
1076
return new_field_ptr->sql_type == real_type();
1108
1079
bool Field::eq_def(Field *field)
1110
if (real_type() != field->real_type() || charset() != field->charset() ||
1111
pack_length() != field->pack_length())
1081
return real_type() == field->real_type() && charset() == field->charset() && pack_length() == field->pack_length();
1116
1084
bool Field_enum::eq_def(Field *field)
1126
1094
for (uint32_t i=0 ; i < from_lib->count ; i++)
1128
1096
if (my_strnncoll(field_charset,
1129
(const unsigned char*)typelib->type_names[i],
1130
strlen(typelib->type_names[i]),
1131
(const unsigned char*)from_lib->type_names[i],
1132
strlen(from_lib->type_names[i])))
1097
(const unsigned char*)typelib->type_names[i], strlen(typelib->type_names[i]),
1098
(const unsigned char*)from_lib->type_names[i], strlen(from_lib->type_names[i])))
1164
1131
uint32_t pack_length_to_packflag(uint32_t type)
1167
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
1170
case 4: return f_settype(DRIZZLE_TYPE_LONG);
1171
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
1135
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
1138
case 4: return f_settype(DRIZZLE_TYPE_LONG);
1139
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
1173
1142
return 0; // This shouldn't happen