23
23
#include <drizzled/error.h>
24
24
#include <drizzled/item/string.h>
29
Item *Item_string::safe_charset_converter(const CHARSET_INFO * const tocs)
28
Item *Item_string::safe_charset_converter(const charset_info_st * const tocs)
34
30
String tmp, cstr, *ostr= val_str(&tmp);
35
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
36
if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(),
38
collation.derivation)))
41
Safe conversion is not possible (or EOM).
42
We could not convert a string into the requested character set
43
without data loss. The target charset does not cover all the
44
characters from the string. Operation cannot be done correctly.
49
if (!(ptr= getSession().strmake(cstr.ptr(), cstr.length())))
31
cstr.copy(ostr->ptr(), ostr->length(), tocs);
32
Item_string* conv= new Item_string(cstr.ptr(), cstr.length(), cstr.charset(), collation.derivation);
33
char* ptr= getSession().mem.strdup(cstr);
52
35
conv->str_value.set(ptr, cstr.length(), cstr.charset());
53
36
/* Ensure that no one is going to change the result string */
59
Item *Item_static_string_func::safe_charset_converter(const CHARSET_INFO * const tocs)
42
Item *Item_static_string_func::safe_charset_converter(const charset_info_st * const tocs)
63
44
String tmp, cstr, *ostr= val_str(&tmp);
64
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
66
!(conv= new Item_static_string_func(func_name,
67
cstr.ptr(), cstr.length(),
69
collation.derivation)))
72
Safe conversion is not possible (or EOM).
73
We could not convert a string into the requested character set
74
without data loss. The target charset does not cover all the
75
characters from the string. Operation cannot be done correctly.
45
cstr.copy(ostr->ptr(), ostr->length(), tocs);
46
Item_string* conv= new Item_static_string_func(func_name, cstr.ptr(), cstr.length(), cstr.charset(), collation.derivation);
79
47
conv->str_value.copy();
80
48
/* Ensure that no one is going to change the result string */
81
49
conv->str_value.mark_as_const();
98
void Item_string::print(String *str, enum_query_type query_type)
66
void Item_string::print(String *str)
100
if (query_type == QT_ORDINARY && is_cs_specified())
103
str->append(collation.collation->csname);
106
68
str->append('\'');
108
str_value.print(str);
69
str_value.print(*str);
110
70
str->append('\'');
115
75
assert(fixed == 1);
119
const CHARSET_INFO * const cs= str_value.charset();
78
const charset_info_st* cs= str_value.charset();
121
org_end= (char*) str_value.ptr() + str_value.length();
122
tmp= my_strntod(cs, (char*) str_value.ptr(), str_value.length(), &end,
80
char* org_end= (char*) str_value.ptr() + str_value.length();
81
double tmp= my_strntod(cs, (char*) str_value.ptr(), str_value.length(), &end, &error);
124
82
if (error || (end != org_end && !check_if_only_end_space(cs, end, org_end)))
127
85
We can use str_value.ptr() here as Item_string is gurantee to put an
130
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
131
ER_TRUNCATED_WRONG_VALUE,
132
ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE",
88
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE, ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE", str_value.ptr());
144
99
assert(fixed == 1);
147
101
char *end= (char*) str_value.ptr()+ str_value.length();
148
102
char *org_end= end;
149
const CHARSET_INFO * const cs= str_value.charset();
103
const charset_info_st * const cs= str_value.charset();
151
tmp= (*(cs->cset->strtoll10))(cs, str_value.ptr(), &end, &err);
105
int64_t tmp= (*(cs->cset->strtoll10))(cs, str_value.ptr(), &end, &err);
153
107
TODO: Give error if we wanted a signed integer and we got an unsigned
157
(end != org_end && !check_if_only_end_space(cs, end, org_end)))
110
if (err > 0 || (end != org_end && !check_if_only_end_space(cs, end, org_end)))
159
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
160
ER_TRUNCATED_WRONG_VALUE,
161
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
112
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_TRUNCATED_WRONG_VALUE, ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER", str_value.ptr());
172
122
int Item_string::save_in_field(Field *field, bool)
175
result=val_str(&str_value);
124
String* result=val_str(&str_value);
176
125
return save_str_value_in_field(field, result);