22
#include <drizzled/server_includes.h>
23
23
#include <drizzled/field/str.h>
24
24
#include <drizzled/error.h>
25
25
#include <drizzled/table.h>
26
26
#include <drizzled/session.h>
27
#include "drizzled/internal/m_string.h"
34
extern char _dig_vec_upper[];
37
Field_str::Field_str(unsigned char *ptr_arg,
29
Field_str::Field_str(unsigned char *ptr_arg,uint32_t len_arg,
39
30
unsigned char *null_ptr_arg,
40
unsigned char null_bit_arg,
31
unsigned char null_bit_arg, utype unireg_check_arg,
41
32
const char *field_name_arg,
42
33
const CHARSET_INFO * const charset_arg)
43
:Field(ptr_arg, len_arg,
34
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
35
unireg_check_arg, field_name_arg)
49
37
field_charset= charset_arg;
50
38
if (charset_arg->state & MY_CS_BINSORT)
52
40
field_derivation= DERIVATION_IMPLICIT;
56
Check if we lost any important data and send a truncation error/warning
59
Field_str::report_if_important_data()
60
ptr - Truncated rest of string
61
end - End of truncated string
64
0 - None was truncated (or we don't count cut fields)
65
2 - Some bytes was truncated
68
Check if we lost any important data (anything in a binary string,
69
or any non-space in others). If only trailing spaces was lost,
70
send a truncation note, otherwise send a truncation error.
74
Field_str::report_if_important_data(const char *field_ptr, const char *end)
76
if ((field_ptr < end) && getTable()->in_use->count_cuted_fields)
78
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
86
44
Decimal representation of Field_str.
105
63
int Field_str::store_decimal(const my_decimal *d)
107
char buff[DECIMAL_MAX_STR_LENGTH+1];
108
String str(buff, sizeof(buff), &my_charset_bin);
109
my_decimal2string(E_DEC_FATAL_ERROR, d, 0, 0, 0, &str);
110
return store(str.ptr(), str.length(), str.charset());
66
/* TODO: use decimal2string? */
67
int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR &
68
~E_DEC_OVERFLOW, d, &val));
69
return err | store(val);
113
72
my_decimal *Field_str::val_decimal(my_decimal *decimal_value)
135
ASSERT_COLUMN_MARKED_FOR_WRITE;
137
length= internal::my_gcvt(nr, internal::MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
94
length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
140
if (getTable()->in_use->abort_on_warning)
97
if (table->in_use->abort_on_warning)
141
98
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
143
100
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
145
102
return store(buff, length, charset());
105
/* If one of the fields is binary and the other one isn't return 1 else 0 */
107
bool Field_str::compare_str_field_flags(Create_field *new_field_ptr,
110
return (((new_field_ptr->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
111
!(flag_arg & (BINCMP_FLAG | BINARY_FLAG))) ||
112
(!(new_field_ptr->flags & (BINCMP_FLAG | BINARY_FLAG)) &&
113
(flag_arg & (BINCMP_FLAG | BINARY_FLAG))));
117
uint32_t Field_str::is_equal(Create_field *new_field_ptr)
119
if (compare_str_field_flags(new_field_ptr, flags))
122
return ((new_field_ptr->sql_type == real_type()) &&
123
new_field_ptr->charset == field_charset &&
124
new_field_ptr->length == max_display_length());
149
128
bool check_string_copy_error(Field_str *field,
150
129
const char *well_formed_error_pos,
197
push_warning_printf(field->getTable()->in_use,
198
field->getTable()->in_use->abort_on_warning ?
176
push_warning_printf(field->table->in_use,
177
field->table->in_use->abort_on_warning ?
199
178
DRIZZLE_ERROR::WARN_LEVEL_ERROR :
200
179
DRIZZLE_ERROR::WARN_LEVEL_WARN,
201
180
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
202
181
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
203
182
"string", tmp, field->field_name,
204
(uint32_t) field->getTable()->in_use->row_count);
183
(uint32_t) field->table->in_use->row_count);
208
uint32_t Field_str::max_data_length() const
210
return field_length + (field_length > 255 ? 2 : 1);
213
} /* namespace drizzled */