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>
29
Field_str::Field_str(unsigned char *ptr_arg,uint32_t len_arg,
27
#include "drizzled/internal/m_string.h"
34
extern char _dig_vec_upper[];
37
Field_str::Field_str(unsigned char *ptr_arg,
30
39
unsigned char *null_ptr_arg,
31
unsigned char null_bit_arg, utype unireg_check_arg,
40
unsigned char null_bit_arg,
32
41
const char *field_name_arg,
33
42
const CHARSET_INFO * const charset_arg)
34
:Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
35
unireg_check_arg, field_name_arg)
43
:Field(ptr_arg, len_arg,
37
49
field_charset= charset_arg;
38
50
if (charset_arg->state & MY_CS_BINSORT)
40
52
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) && table->in_use->count_cuted_fields)
78
if (test_if_important_data(field_charset, field_ptr, end))
80
if (table->in_use->abort_on_warning)
81
set_warning(DRIZZLE_ERROR::WARN_LEVEL_ERROR, ER_DATA_TOO_LONG, 1);
83
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
85
else /* If we lost only spaces then produce a NOTE, not a WARNING */
86
set_warning(DRIZZLE_ERROR::WARN_LEVEL_NOTE, ER_WARN_DATA_TRUNCATED, 1);
44
93
Decimal representation of Field_str.
63
112
int Field_str::store_decimal(const my_decimal *d)
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);
114
char buff[DECIMAL_MAX_STR_LENGTH+1];
115
String str(buff, sizeof(buff), &my_charset_bin);
116
my_decimal2string(E_DEC_FATAL_ERROR, d, 0, 0, 0, &str);
117
return store(str.ptr(), str.length(), str.charset());
72
120
my_decimal *Field_str::val_decimal(my_decimal *decimal_value)
94
length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
142
ASSERT_COLUMN_MARKED_FOR_WRITE;
144
length= internal::my_gcvt(nr, internal::MY_GCVT_ARG_DOUBLE, local_char_length, buff, &error);
97
147
if (table->in_use->abort_on_warning)
102
152
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());
128
156
bool check_string_copy_error(Field_str *field,
129
157
const char *well_formed_error_pos,