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
62
/*****************************************************************************
60
63
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);
748
bool Field::is_null(ptrdiff_t row_offset) const
750
return null_ptr ? (null_ptr[row_offset] & null_bit ? true : false) : table->null_row;
753
bool Field::is_real_null(ptrdiff_t row_offset) const
755
return null_ptr && (null_ptr[row_offset] & null_bit);
758
bool Field::is_null_in_record(const unsigned char *record) const
760
return null_ptr && test(record[(uint32_t) (null_ptr -table->getInsertRecord())] & null_bit);
763
bool Field::is_null_in_record_with_offset(ptrdiff_t with_offset) const
765
return null_ptr && test(null_ptr[with_offset] & null_bit);
771
768
void Field::set_null(ptrdiff_t row_offset)
780
777
null_ptr[row_offset]&= (unsigned char) ~null_bit;
783
bool Field::maybe_null(void)
780
bool Field::maybe_null(void) const
785
782
return null_ptr != 0 || table->maybe_null;
788
bool Field::real_maybe_null(void)
785
bool Field::real_maybe_null(void) const
790
787
return null_ptr != 0;
793
790
bool Field::type_can_have_key_part(enum enum_field_types type)
796
794
case DRIZZLE_TYPE_VARCHAR:
797
795
case DRIZZLE_TYPE_BLOB:
876
874
int Field::store_and_check(enum_check_fields check_level,
879
const CHARSET_INFO * const cs)
877
const charset_info_st * const cs)
883
880
enum_check_fields old_check_level= table->in_use->count_cuted_fields;
884
881
table->in_use->count_cuted_fields= check_level;
885
res= store(to, length, cs);
882
int res= store(to, length, cs);
886
883
table->in_use->count_cuted_fields= old_check_level;
898
895
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);
897
return this->pack(to, from, UINT32_MAX, table->getShare()->db_low_byte_first);
904
900
const unsigned char *Field::unpack(unsigned char* to,
936
932
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);
934
return unpack(to, from, 0, table->getShare()->db_low_byte_first);
942
type::Decimal *Field::val_decimal(type::Decimal *)
937
type::Decimal *Field::val_decimal(type::Decimal *) const
944
939
/* This never have to be called */
1008
1003
return copy->length+ store_length;
1011
bool Field::get_date(type::Time <ime, uint32_t fuzzydate)
1006
bool Field::get_date(type::Time <ime, uint32_t fuzzydate) const
1013
1008
char buff[type::Time::MAX_STRING_LENGTH];
1014
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
1009
String tmp(buff,sizeof(buff),&my_charset_bin);
1016
1011
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)
1013
String* res= val_str_internal(&tmp);
1014
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)
1017
bool Field::get_time(type::Time <ime) const
1031
1019
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))
1020
String tmp(buff,sizeof(buff),&my_charset_bin);
1022
String* res= val_str_internal(&tmp);
1023
return not res or str_to_time_with_warn(getTable()->getSession(), res->ptr(), res->length(), <ime);
1043
1026
int Field::store_time(type::Time <ime, type::timestamp_t)
1047
1029
ltime.convert(tmp);
1049
1030
return store(tmp.ptr(), tmp.length(), &my_charset_bin);
1077
1055
unsigned char *new_null_ptr,
1078
1056
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;
1058
Field *tmp= new_field(root, new_table, table == new_table);
1060
tmp->null_ptr= new_null_ptr;
1061
tmp->null_bit= new_null_bit;
1090
1065
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()));
1067
Field *tmp= (Field*) root->memdup(this,size_of());
1068
tmp->init(new_table);
1069
tmp->move_field_offset((ptrdiff_t) (new_table->getInsertRecord() - new_table->getDefaultValues()));
1103
1073
uint32_t Field::is_equal(CreateField *new_field_ptr)
1105
return (new_field_ptr->sql_type == real_type());
1075
return new_field_ptr->sql_type == real_type();
1108
1078
bool Field::eq_def(Field *field)
1110
if (real_type() != field->real_type() || charset() != field->charset() ||
1111
pack_length() != field->pack_length())
1080
return real_type() == field->real_type() && charset() == field->charset() && pack_length() == field->pack_length();
1116
1083
bool Field_enum::eq_def(Field *field)
1126
1093
for (uint32_t i=0 ; i < from_lib->count ; i++)
1128
1095
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])))
1096
(const unsigned char*)typelib->type_names[i], strlen(typelib->type_names[i]),
1097
(const unsigned char*)from_lib->type_names[i], strlen(from_lib->type_names[i])))
1164
1130
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);
1134
case 1: return 1 << FIELDFLAG_PACK_SHIFT;
1137
case 4: return f_settype(DRIZZLE_TYPE_LONG);
1138
case 8: return f_settype(DRIZZLE_TYPE_LONGLONG);
1173
1141
return 0; // This shouldn't happen