22 #include <drizzled/error.h>
23 #include <drizzled/field.h>
24 #include <drizzled/item/hex_string.h>
25 #include <drizzled/item/string.h>
26 #include <drizzled/type/decimal.h>
34 static char _dig_vec_lower[] =
"0123456789abcdefghijklmnopqrstuvwxyz";
36 inline uint32_t char_val(
char X)
38 return (uint32_t) (X >=
'0' && X <=
'9' ? X-
'0' :
39 X >=
'A' && X <=
'Z' ? X-
'A'+10 :
43 Item_hex_string::Item_hex_string(
str_ref arg)
45 max_length= (arg.size() + 1) / 2;
46 char *ptr=(
char*) memory::sql_alloc(max_length+1);
49 str_value.set(ptr,max_length,&my_charset_bin);
50 const char *str= arg.data();
51 char *end=ptr+max_length;
52 if (max_length * 2 != arg.size())
53 *ptr++=char_val(*str++);
56 *ptr++= (char) (char_val(str[0])*16+char_val(str[1]));
60 collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
65 int64_t Item_hex_string::val_int()
69 char *end= (
char*) str_value.ptr()+str_value.length(),
70 *ptr= end - min(str_value.length(),
sizeof(int64_t));
73 for (; ptr != end ; ptr++)
74 value=(value << 8)+ (uint64_t) (
unsigned char) *ptr;
75 return (int64_t) value;
83 uint64_t value= (uint64_t)val_int();
84 int2_class_decimal(E_DEC_FATAL_ERROR, value,
true, decimal_value);
85 return (decimal_value);
88 int Item_hex_string::save_in_field(
Field *field,
bool)
91 if (field->result_type() == STRING_RESULT)
92 return field->store(str_value.ptr(), str_value.length(), collation.collation);
95 uint32_t length= str_value.length();
98 nr= field->flags & UNSIGNED_FLAG ? UINT64_MAX : INT64_MAX;
101 nr= (uint64_t) val_int();
102 if ((length == 8) && !(field->flags & UNSIGNED_FLAG) && (nr > INT64_MAX))
107 return field->store((int64_t) nr,
true);
110 if (!field->store((int64_t) nr,
true))
111 field->
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
117 char *end= (
char*) str_value.ptr() + str_value.length(),
118 *ptr= end - min(str_value.length(),
sizeof(int64_t));
119 str->append(STRING_WITH_LEN(
"0x"));
120 for (; ptr != end ; ptr++)
122 str->append(_dig_vec_lower[((
unsigned char) *ptr) >> 4]);
123 str->append(_dig_vec_lower[((
unsigned char) *ptr) & 0x0F]);
128 bool Item_hex_string::eq(
const Item *arg,
bool binary_cmp)
const
133 return !stringcmp(&str_value, &arg->
str_value);
134 return !sortcmp(&str_value, &arg->
str_value, collation.collation);
141 String tmp, *str= val_str(&tmp);