23 #include <drizzled/field/str.h>
24 #include <drizzled/error.h>
25 #include <drizzled/table.h>
26 #include <drizzled/session.h>
27 #include <drizzled/internal/m_string.h>
33 extern char _dig_vec_upper[];
36 Field_str::Field_str(
unsigned char *ptr_arg,
38 unsigned char *null_ptr_arg,
39 unsigned char null_bit_arg,
40 const char *field_name_arg,
41 const charset_info_st *
const charset_arg)
42 :Field(ptr_arg, len_arg,
48 field_charset= charset_arg;
49 if (charset_arg->state & MY_CS_BINSORT)
51 field_derivation= DERIVATION_IMPLICIT;
72 int Field_str::report_if_important_data(
const char *field_ptr,
const char *end)
74 if (field_ptr < end && getTable()->in_use->count_cuted_fields)
76 set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
104 char buff[DECIMAL_MAX_STR_LENGTH+1];
105 String str(buff,
sizeof(buff), &my_charset_bin);
107 return store(str.ptr(), str.length(), str.charset());
112 int2_class_decimal(E_DEC_FATAL_ERROR, val_int(), 0, decimal_value);
113 return decimal_value;
126 char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
127 uint32_t local_char_length= field_length / charset()->mbmaxlen;
130 ASSERT_COLUMN_MARKED_FOR_WRITE;
132 size_t length= internal::my_gcvt(nr, internal::MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
135 if (getTable()->getSession()->abortOnWarning())
137 set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
141 set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
144 return store(buff, length, charset());
148 bool check_string_copy_error(
Field_str *field,
149 const char *well_formed_error_pos,
150 const char *cannot_convert_error_pos,
154 const char* pos= well_formed_error_pos;
155 if (not pos && not (pos= cannot_convert_error_pos))
158 const char* end_orig= end;
159 set_if_smaller(end, pos + 6);
163 for (; pos < end; pos++)
174 if (((
unsigned char) *pos) >= 0x20 && ((
unsigned char) *pos) <= 0x7F && cs->mbminlen == 1)
182 *t++= internal::_dig_vec_upper[((
unsigned char) *pos) >> 4];
183 *t++= internal::_dig_vec_upper[((
unsigned char) *pos) & 15];
193 push_warning_printf(field->getTable()->
in_use,
194 field->getTable()->
in_use->abortOnWarning() ? DRIZZLE_ERROR::WARN_LEVEL_ERROR : DRIZZLE_ERROR::WARN_LEVEL_WARN,
195 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
196 ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
204 return field_length + (field_length > 255 ? 2 : 1);