22 #include <drizzled/charset.h>
23 #include <drizzled/field.h>
24 #include <drizzled/item/decimal.h>
28 Item_decimal::Item_decimal(
const char *str_arg, uint32_t length,
29 const charset_info_st *
const charset)
31 decimal_value.
store(E_DEC_FATAL_ERROR, str_arg, length, charset);
32 name= (
char*) str_arg;
33 decimals= (uint8_t) decimal_value.frac;
35 max_length= class_decimal_precision_to_length(decimal_value.intg + decimals,
36 decimals, unsigned_flag);
39 Item_decimal::Item_decimal(int64_t val,
bool unsig)
41 int2_class_decimal(E_DEC_FATAL_ERROR, val, unsig, &decimal_value);
42 decimals= (uint8_t) decimal_value.frac;
44 max_length= class_decimal_precision_to_length(decimal_value.intg + decimals,
45 decimals, unsigned_flag);
49 Item_decimal::Item_decimal(
double val,
int,
int)
51 double2_class_decimal(E_DEC_FATAL_ERROR, val, &decimal_value);
52 decimals= (uint8_t) decimal_value.frac;
54 max_length= class_decimal_precision_to_length(decimal_value.intg + decimals,
55 decimals, unsigned_flag);
58 Item_decimal::Item_decimal(
const char *str,
const type::Decimal *val_arg,
59 uint32_t decimal_par, uint32_t length)
61 class_decimal2decimal(val_arg, &decimal_value);
63 decimals= (uint8_t) decimal_par;
69 Item_decimal::Item_decimal(type::Decimal *value_par)
71 class_decimal2decimal(value_par, &decimal_value);
72 decimals= (uint8_t) decimal_value.frac;
74 max_length= class_decimal_precision_to_length(decimal_value.intg + decimals,
75 decimals, unsigned_flag);
79 Item_decimal::Item_decimal(
const unsigned char *bin,
int precision,
int scale)
81 binary2_class_decimal(E_DEC_FATAL_ERROR, bin,
82 &decimal_value, precision, scale);
83 decimals= (uint8_t) decimal_value.frac;
85 max_length= class_decimal_precision_to_length(precision, decimals,
92 decimal_value.val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
99 class_decimal2double(E_DEC_FATAL_ERROR, &decimal_value, &result);
105 result->set_charset(&my_charset_bin);
134 void Item_decimal::set_decimal_value(
type::Decimal *value_par)
136 class_decimal2decimal(value_par, &decimal_value);
137 decimals= (uint8_t) decimal_value.frac;
138 unsigned_flag= !decimal_value.sign();
139 max_length= class_decimal_precision_to_length(decimal_value.intg + decimals,
140 decimals, unsigned_flag);
143 int Item_decimal::save_in_field(Field *field,
bool)
145 field->set_notnull();
146 return field->store_decimal(&decimal_value);
virtual bool basic_const_item() const
bool eq(const Item *, bool binary_cmp) const
TODO: Rename this file - func.h is stupid.
int class_decimal_cmp(const type::Decimal *a, const type::Decimal *b)
int store(uint32_t mask, const char *from, uint32_t length, const charset_info_st *charset)
Convert string for decimal when string can be in some multibyte charset.
String * val_str(String *)
virtual void print(String *str)
int class_decimal2string(const type::Decimal *d, uint32_t fixed_dec, String *str)
Converting decimal to string.
virtual type::Decimal * val_decimal(type::Decimal *decimal_buffer)=0